Redis 简介
Redis 是一个速度非常快的非关系数据库, 它可以存储键与 5 种不同两类型的值之间的映射. 可以将存储在内存中的键值对持久到硬盘, 可以使用复制特性来扩展读性能, 还可以使用客户端分片来扩展写性能.
分片
分片是一种将数据划分为多个部分的方法, 对数据的划分可以基于键包含的 ID, 基于键的散列值, 或者基于以上两种的某种组合.
通过对数据进行分片, 用户可以将数据存储到多台机器里面, 也可以从多台机器里面获取数据, 这种方法在解决某些问题时可以获得线性级别的性能提升.
Redis 实现了主从复制特性: 执行复制的从服务器会连接上主服务器, 接收主服务器发送的整个数据库的初始副本; 之后主服务器执行的写命令, 都会被发送给所有连接着的从服务器去执行, 从而实时地更新从服务器的数据集.
数据类型
Redis 中的字符串
STRING
可以是字符串, 整数或者浮点数. 对整个字符串或者字符串的其中一部分执行操作; 对整个数和浮点数执行自增或者自减操作.
三个简单的例子:
set key value (如果存在就是修改, 不存在则是添加)
get key (通过键获取值)
del key (删除, 适用于所有类型)
Redis 中的列表
LIST
一个链表, 链表上的每个节点都包含了一个字符串. 从链表的两端推出或弹出元素; 根据偏移量对链表进行修剪; 读取单个或多个元素; 根据值查找或移除元素.
列表 (链表) 是有序的. 另外获取元素时, 元素下标是从 0(零) 开始
几个简单的例子:
LPUSH 从左端插入元素.
RPUSH 从右端插入元素.
LPOP 从列表的左端弹出一个值, 并返回弹出的值(会移除元素).
RLOP 从列表的右端弹出一个值, 并返回弹出的值(会移除元素).
LRANGE 获取列表在给定范围上的所有值. lrange key 0 -1 表示从零开始获取到最后.
LINDEX 获取列表在给定位置上的单个元素.
Redis 中的集合
SET
包含字符串的无序收集器, 并且被包含的每个字符串都是不可重复的. 添加, 获取, 移除单个儿元素; 检查一个元素是否存在集合中; 计算交集, 并集, 差集; 从集合里面随机获取元素.
集合中的所有元素都是无序不可重的.
几个简单的例子:
sadd 将元素添加到集合, 返回添加成功的元素个数.
smembers 返回集合包含的所有元素.
sismember 检查指定元素是否在集合中, 如果存在返回1, 否则返回0.
srem 如果给定的元素存在集合中, 就移除, 返回被移除元素的数量.
Redis 中的散列
HASH
包含键值对的无序散列表. 添加, 获取, 移除单个键值对或获取所有键值对.
我们可以把 Java 中的 map
集合看做是 redis 中的散列. 键为 String
, 值为 Object
, 也就是说散列适合存储对象.
散列中的键(
field
)都是唯一并且是无序排列的, 没一个键对应一个值.
几个简单的例子:
hset 如果给定的哈希表并不存在, 那么一个新的哈希表(散列). 如果域 field (键)已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖.
hget 默认情况下返回给定域的值. 如果给定域不存在于哈希表中, 又或者给定的哈希表并不存在, 那么命令返回 ```nil```.
hgetall 返回散列中所有的域和值.
hdel 移除散列中的域.
Redis 中的有序集合
ZSET
字符串成员与浮点数分值之间的有序映射, 元素的排列顺序由分值的大小决定. 添加, 获取, 删除单个元素; 根据分值范围或者成员来获取元素.
有序集合和散列一样, 都是用于存储键值对: 有序集合的键被称为成员, 每个成员都是各不相同的; 而有序集合的值被称为分值, 分值必须为浮点数.
可以根据成员访问元素, 也可以根据分值以及分值的排列顺序来访问元素的结构.
几个简单的例子:
zadd 将一个带有给定分值的成员添加到有序集合里面.
zrange 根据元素在有序排列中所处的位置, 从有序集合里面获取多个元素.
zrangebyscore 获取所有元素.
zrem 移除元素