五种基本数据类型:
String字符串、Hash 哈希、List 列表、Set 集合、ZSet(Sort Set:有序集合)
底层数据结构一共有 6 种,分别是:简单动态字符串、双向链表、压缩列表、哈 希表、跳表和整数数组。其对应关系如下图所示:
全局哈希表:
hash 可以在 O(1)的时间内计算出 hash 值并且找到对应的 entry 位置,entry 里面是一个一个 key 指针和 value 指针,其实还有其他信息。这也是 redis 之所以性能高的原因之一。
但凡碰见 hash 表的,就一定会有一个冲突(碰撞)问题,并且冲突(碰撞)问题是不能避免的。
可以通过链式哈希解决冲突,也就是同一个桶里面的元素使用链表保存。但是当 链表过长就会导致查找性能变差可能。所以 redis 为了追求块,使用了两个全局哈希表。用于 rehash 操作,增加现有的哈希桶数量,减少哈希冲突。
开始默认使用【hash 表 1】保存键值对数据,【hash 表 2】此刻没有分配空间。 当数据越来越多的触发 rehash 操作,则执行以下操作:
给【hash 表 2】分配更大的空间
将【hash 表 1】的数据重新映射拷贝到【hash 表 2】中
释放【hash 表 1】的空间
将 hash 表 1 的数据重新映射到 hash 表 2 的过程并不是一次性 的,这样会造成 redis 阻塞,无法提供服务。
而是采用了渐进式 rehash,这样每次处理客户端请求的时候,先从【hash 表 1】 第一个索引开始,将这个位置的所有数据拷贝到【hash 表 2】中,就这样将 rehash 分散到多次请求过程中,避免耗时阻塞.
String(字符串)
string 是 redis 最基本的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比 如 jpg 图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
set key
value get key
del key
对象缓存(不对对象中数据操作时可以使用)
set user:1 value(json 格式数据)
计数器:
set news_views:1 0 设置文章访问量
incr news_views:1 文章访问量+1
decr news_views:1 文章访问量-1
get news_views:1 获得值
Web集群 session共享
session + redis 实现 session 共享
Hast(哈希)
redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象(对对象中的数据发生修改情况)。
其类型结果是 key(key:val) 类似于java中的对象名、对象的属性、对象属性的值
hset key field value 存储一个哈希表 key 的键值
hmset key field value [field value …] 存储多个键值对
hget key field 获取哈希表 key 对应的 field 键值
hmget key field [field …] 批量获取哈希表 key 中多个 field 键值
hdel key field [field …] 删除哈希表 key 中的 field 键值
hlen key 返回哈希表 key 中的 field 的数量
hgetall key 返回哈希表 key 中所有的键值
hincrby key field 增加的值(减少给负数)
以电商购物车为例
添加商品→hset cart:1001 10088 1
增加数量→hincrby cart:1001 10088 1
商品总数→hlen cart:1001
删除商品→hdel cart:1001 10088
获取购物车所有商品→hgetall cart:1001
List(列表)
列表是简单的数据结构类型,按照插入的顺序排序,可以添加元素到list的头部,也可以添加元素到list的尾部
lpush key value[value…] 将一个或多个值插入到 key 列表的表头(最左边)
rpush key value[value…] 将一个或多个值插入到 key 列表的表尾(最右边)
lpop key 移除并返回 key 列表的头元素 rpop key 移除并返回 key 列表的尾元素
lrange key start stop 返回列表key中指定区间内的元素,区间以偏移量start 和 stop
使用场景:可以用来存储接收到的消息数据.
Set(集合)
Redis的Set是无序的集合,
sadd key member[member…] 往集合 key 中存入元素
srem key member[member…] 从集合 key 中删除元素
smembers key 获取集合 key 中所有元素
scard key 获取集合 key 的元素个数
Zset(sort set:有序集合)
redis zset 也是不允许重复的成员,但是是有序的。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。zset 的成员是唯一的,但分数(score)却可以重复。
zadd key score member[[score member]…] 往有序集合 key 中加入带分值元素
zrem key member[member…] 从有序集合 key 中删除元素
zscore key member 返回有序集合 key 中元素 member 的分值
zincrby key increment member 为有序集合 key 中元素 member 的分值加上 increment
zcard key 返回有序集合 key 中元素个数
zrange key start stop[withscores] 正序获取有序集合 keyastart 下标到 stop 下标的元素