Redis数据类型
Redis支持五种数据类型的存储
1.字符串(String)
2.字符串列表(list)
3.字符串集合(set)
4.有序字符串集合(sorted sets)
5.哈希(hashes)
关于Key的建议
- 尽量不要太长,不要超过1024字节,会消耗内存,还会拖慢查询的效率
- 不要太短,太短会影响可读性
- 统一命名的风格
String类型的操作实践
字符串类型是redis中最简单的数据类型,他存储的值可以是字符串,最长字符串长队支持到512M
递增
Incr/incrby
当存储的字符串是整数时,使用incr、incrby可以使字符串递增
递减
Decr/decrby
向尾部追加值,返回值是追加字符串的总长度
Append
字符串长度,返回值是字符串的长度,不存在或者空串,返回为0
Strlen key
同时设置/获取多个键
Mset/mget
同时设置/获取多个键
Mset/mget
面试题分析
- 博客的字数如何统计?
答:使用Strlen
- 将日志追加到指定的key?
答:使用append
- 如何实现一个分布式自增id
答:incr
- 如何实现一个博客的点赞操作
答:incr,decr
Hash应用实践
一般用于存储对象信息,存储了字段和字段值的映射路径,最多可以包含232个字段
存储/读取
Hset/hget
Hmset/hmget
设置/获取多个对象属性
属性是否存在
Hexists
删除属性
Hdel
只获取key或者value的值
Hkeys/hvals
面试题:
- 发布一篇博客需要写内存吗?
答:需要,hmset
- 浏览博客内容会怎么做?
答:hmget
- 如何判断博客是否存在
答:hexists
- 如何删除一篇博客?
答:hdel
- 分布式系统中登录成功如何存储用户信息?
答:hmset
List类型应用实践
相当于java中的LinkedList,原理就是一个双向链表。支持正向、反向查找和遍历等操作,插入速度比较快。
应用:热榜,最新评论
在key的对应list的头部添加字符串元素
Lpush
在key对应的list的尾部添加字符串元素
Rpush
返回列表中指定区间的元素,区间以偏移量START和END指定。其中0指定列表的第一个元素,1表示列表的第二个元素。
如果用负数的话,-1表示列表的最后一个元素,-2表示列表的倒数第二个元素
Lrange list 0 -1 表示返回列表中的第一个元素到列表中的最后一个元素
删除key中的元素
Del
Linsert
在key对应的list特定位置中插入元素
Lset
设置list中指定下标的元素值
Lrem
从key对应的list中删除count个和value相同的元素,count>0时,按从头到尾的顺序删除
Ltrim
保留指定key的值范围内的数据
Lpop
从list的头部删除元素,并返回删除的数据
Rpop
从list的尾部删除元素,并返回删除的数据
Llen
返回key对应的list的长度
Lindex
返回指定下标中的元素信息
rpoplpush
从第一个list的尾部移除元素并添加到第二个list的头部,最后返回被移除的元素值,整个操作是原子的.如果第一个list是空或者不存在返回null
面试题:
如何基于redis实现一个队列结构?(lpush/rpop) 先进先出
如何基于redis实现一个栈结构?(lpush/lpop) 先进后出
如何基于redis实现一个阻塞队列?(lpush/brpop)
如何实现秒杀? 先进先出
如何通过list结构实现一个消息队列? FIFO->lpush/rpop
如何动态的更新商品的销量列表? Lisert
粉丝的列表使用什么结构实现? List结构
Set类型应用实践
类似于java中的hashset,无序集合,集合元素不可重复
Sadd
添加元素,如果是重复元素添加失败,返回0
Smembers
获取内容
Spop
移除并返回集合中的一个随机元素
Scard
返回set中的元素个数
Smove
移动元素从一个集合到另外一个集合
Sunion
并集,将两个集合中的元素合并为一个
面试题
朋友圈的点赞功能如何实现? Sadd,srem,smembers,scard