string 字符串、List 列表、Set 集合、Hash 哈希、Zset 有序集合、
String
Redis 基本数据类型,
value 最多可达 512M
二进制安全,意味着Redis 的string 可以包含任何数据,比如 jpg图片 或者 序列化的对象
常用命令
- set key value 设置相同的key 会覆盖之前的
- get key
- append key value 将value 追加到 原值的末尾
- strlen key 获得值的长度
- setnx key value 无法设置已经存在的key
- incr key 将 key 中存储的数字值 加1
- decr key 将 key 中储存的数字值 减1
- incrby key 步长 将 key 中存储的数字值 增加指定 步长
- decrby key 步长 将 key 中存储的数字值 减少指定 步长
incr 是原子性操作
-
mset key1 value1 key2 value2 ... 同时设置一个或多个 key-value
-
mget key1 key2 key3 ... 同时取多个 key的value
-
msetnx key11 value11 key22 value2 ... 设置的 key 不存在
-
getrange key 起始位置 结束位置
-
setrange key 起始位置 结束位置
-
setex key 过期时间 value 设置键值的同时 设置过期时间 单位秒
-
getset key value 设置新值同时获得旧值
数据结构
简单动态字符串 simple dynamic string 可以修改的字符串 内部机构类似于 Java ArrayList
List
单键 多值
底层实际是个 双向链表 对两端的操作性能很高 通过索引下标的操作中间的节点性能会比较差
常用命令
-
lpush/rpush key value1 value2 value3 ... 从左边或右边 插入一个或多个值
-
lpop / rpop key 从左边/右边吐出一个值 。 值在键在 值光键亡
-
rpoplpush key1 key2 从key1右边吐出一个值加到key2左边
-
lrange key start end 按照索引取 0 左边第一个 -1 右边第一个
lrange mylist 0 -1 取出所有
- lindex key index 按照索引下标获得元素 从左到右
- llen key 获得列表长度
- linsert key before/after value newvalue 在value的前面或后面插入 newvalue 插入值
- lrem key n value 从左边删除 n 个 value 从左到右
- lset key index value 将列表 key 下标为index 的值替换成 value
数据结构
List 的数据结构为快速链表 quickList
数据很少的话 找一块连续的内存空间 这个结构是 ziplist
数据很多的话 ziplist 被链接起来
因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表存的是 int类型的数据,结构上还需要两个额外的指针 prev next
Redis 将链表 和 ziplist 结合起来组成了 quicklist,也就是将多个 ziplist 使用双向指针串起来使用,既满足了快速的插入删除性能,又不会出现太大的空间冗余
Set
特殊之处在于,自动排重的,
无序集合 底层是 value为null的hash表
常用命令
- sadd key value1 value2 将一个或多个member 加入 集合key中,已经存在的member 元素将被忽略
- smembers key 取出该集合的所有值
- sismember key value 判断集合 key 是否为含有该value 值 有 1 没有0
- scard key 返回集合的元素个数
- srem key value1 value2 删除集合中的某个元素
- spop key 随机取出一个值
- srandmember key n 随机从该集合中取出n个值,不会从集合中删除
- smove sourcekey destinationkey value 从souce 移动 value 到 desination
- sinter key1 key2 交集
- sunion key1 key2 并集
- sdiff key1 key2 差集
数据结构
Set 数据结构是dict 字典,字典是用哈希表实现的
内部使用hash结果 所有value都指向一个值
Hash
Redis hash 是一个 键值对集合
Redis hash 是一个 string 类型的field 和 value的映射表,hash 特别适合用于存储对象
两种存储方式
第三种
常用命令
- hset key field value
- hget key field
- hmset key field1 value1 field2 value2 ... 同时设置多个
- hexists key field 判断 field是否存在
- hkeys key 查看所有field
- hvals key 查看所有field对应的值
- hincrby key field increment 增加
- hsetnx key field value 仅当 field不存在时可以添加
数据结构
Hash类型对应的数据结构是两种 ziplist hashtable
当field-value 长度较短 且个数较少时,使用ziplist 否则使用 hashtable
Zset
Redis 有序集合 zset 与 普通集合 set 非常相似 是一个 没有重复元素的字符串集合
不同之处是有序集合的每个成员你都关联了一个 评分 score 这个 score 被用来按照从最低分到最高分的方式排序集合中的成员
集合的成员是唯一的,但是 评分可以是重复的
元素是有序的,所以可以很快根据评分 score 或者 position 来获得一个范围的元素
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表
常用命令
-
zadd key score1 value1 score2 value2 ... 将一个或多个 member 元素 及其 score 值加入到有序集合key当中
-
zrange key start end [withscores] 返回有序集合 key 中 下标 在start end 之间的元素 带 withscores 可以让分数一起返回
-
zrangebyscore key minmax [withscores] [limit offset count] 返回有序集合key 中 所有score值介于min 和 max 之间 包括等于 min 或 max 的成员 有序集成员按 score 值递增 从小到大 次序排列
-
zrevrangebyscore key max min [withscores] [limit offset count] 同上 区别从大到小排列
-
zincrby key increment value 为元素的score加上增量
-
zrem key value 删除该集合下 指定的value
-
zcount key min max 统计该集合,分数区间内的元素个数
-
zrank key value 返回该值在集合中的排名 从0开始
案例 如何利用zset 实现一个文章访问量的排行榜
数据结构
sortedset 是 redis 提供的一个特别的结构,一方面它等价与Java 的数据结构 Map<String,Double> 可以给每一个元素 Value 赋予一个权重,另一方面它又类似于TreeSet,内部的元素按照权重score 进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表
使用了两个数据结构
(1)hash hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值
(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表