常用数据类型
字符串
特点
(一) 键都是字符串类型
(二) 字符串类型的 值最大不能超过512MB
命令
(一)批量设置值
mset key value [key value ... ] 时间复杂度:O(k),k是键的个数
(二)批量获取值
mget key [key ... ] 时间复杂度:O(k),k是键的个数
(三)计数
incr key
内部编码
int:8个字节的长整型
embstr:小于等于39个字节的字符串
raw:大于39个字节的字符串
Redis会根据当前值的类型和长度决定使用哪种内部编码实现
典型使用场景
(一)缓存功能
Redis作为缓存层,MySQL作为存储层,大部分请求的数据都是从Redis中获取。
(二)计数
Redis可以实现快速计数、查询缓存的功能,例如视频播放次数计数
(三)共享Session
使用Redis将用户的Session进行集中管理
哈希
在Redis中,哈希类型是指键值本身又是一种键值对结构
内部编码
(一)ziplist(压缩列表):ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀
(二)hashtable(哈希表):hashtable的读写时间复杂度为O(1)
使用场景
三种方法缓存用户信息
1)原生字符串类型:每个属性一个键
set user:1:name tom
set user:1:age 23
set user:1:city beijing
优点:简单直观
缺点:占用过多的键,内存占用量大,此种方案一般不会在生产环境使用
2)序列化字符串类型:将用户信息序列化后用一个键存储
set user:1 serialize(userInfo)
优点:简化编程
缺点:序列化和反序列化有一定开销,,每次更新属性都需要反序列化取出数据,更新之后再序列化到Redis
3)哈希类型:每个用户属性使用一对filed-value,但是只用一个键保存
hmset user:1 name tom age .....
优点:简单直观
缺点:要控制好哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多内存
列表
(一)在Redis中,可以对列表两端插入和弹出,可以充当栈和队列的角色
(二)列表中的元素是有序的
(三)列表中的元素可以是重复的
命令
(一)从右边插入元素
rpush key value [value ...]
(二)从左边插入元素
lpush key value [value ...]
(三)从列表左侧弹出元素
lpop key
(四)从列表右侧弹出
rpop key
内部编码
ziplist(压缩列表)
linkedlist(链表)
Redis 3.2版本之后提供了quicklist内部编码,结合了ziplist和linkedlist两者的优势
使用场景
(一)消息队列
Redis的lpush+brpop命令组合实现阻塞队列
(二)文章列表
集合
特点
(一)集合中不允许有重复元素
(二)集合中的元素无序
内部编码
(一)intset:整数集合
(二)hashtable
使用场景
(一)标签
给用户添加标签
sadd user:1:tags tag1 tag2 tag5
有序集合
特点
(一)没有重复元素
(二)元素可排序
内部编码
(一)ziplist(压缩列表)
(二)skiplist(跳跃表)
使用场景
(一)排行榜系统