Redis基础应用
一、redis能做什么?
- 记录帖子点赞数、评论数、点击数
- 记录用户的帖子ID列表,用户快速展示
- 记录帖子的标题、摘要、作者和封面信息,用于展示
- 记录帖子的点击用户ID、评论ID,用户显示和去重
- 缓存几千里热帖内容,减少数据库压力
- 记录帖子相关文章ID,根据内容推荐相关帖子
- 如果帖子ID是整数自增的,可以用来分配帖子ID
- 收藏集和帖子之间的关系
- 记录热榜帖子ID、总榜、分类热榜
- 缓存用户历史行为,过滤恶意行为
二、Redis有哪些数据结构
- String 字符串
- list 列表
- hash 字典
- set 集合
- zset 有序集合
1. String 字符串
- 能够用于存储用户信息
- redis的字符串是动态字符串,能够修改,内部结构类似于arraylist,采用预分配冗余空间的方式是减少内存的频繁分配
- 字符串小于1M,扩容都是现有容量翻倍扩量,如果字符串大于1M,扩容只递增1M
- 字符串最大长度512M
set key value
get key
mget key1 key2 key3
mset key1 value1 key2 value2 key3 value3
expire key1 5 #key1 5秒后过期
setex key1 5 sssss # 相当于set+expire 过期
setnx key1 value1 #如果key1不存在就设置value1
value值是整数的话,可以执行自增
set key1 55
incr key1 #+1
incr key1 5 #60
incr key1 -5 #55
递增不饿能唱超过Long.MAX_VALUE
2.list 列表
-
相当于JAVA数据类型:LinkedList,链表结构不是数组结构,因而list数据类型删除和新增很快(O(1)),但是索引定位比较慢(O(n)),列表中的值都有向前向后指针,支持向前向后遍历
-
常用来做异步队列使用(队列,先进先出保证确保元素的访问顺序,栈,后进先出,与队列相反)
rpush key1 value1 value2 value3
llen key1 #队列
lpop key1 #队列
rpop key1 #栈
lindex keys 1 #链表get(index)
ltrim key1 start end
lrange key1 start end
- 底层使用quicklist实现类linkedlist的结构,在元素较少的情况,会使用连续的内存存储,结构是ziplist-压缩列表。数据较多的时候,才改成quicklist,使用链表和ziplist整合起来,将多个ziplist使用双向指针串联,既满足快速插入删除性能,又不会出现太大的空间冗余
3.Hash 字典
- 类似于HashMap,是无序字典,存储键值对,数组+链表的数据结构。redis只能存储字符串,并且rehash逻辑不同,采用渐进式rehash策略,追求高性能,避免阻塞服务。渐进式rehash会同时保留新旧两个hash的结构,读取数据会同时分发到新旧hash上,在后续的定时任务以及hash操作指令中,循序渐进地将旧的hash内容一点点迁移到新的hash结构中,才会使用新的hash取代旧的hash
- 可以用于存储用户信息,可以存储在一起,或者按照属性值存储,按属性读取
hget book key
hset book key value
hgetall book
hlen book
hset book key value1
hmset book key1 value2 key2 value3
#针对整形的value能够进行递增
hset book price1 20
hincrby book price1 5 #增加5元
4.set集合
- 类似于HashSet,内部键值对是无序唯一的,特殊的HashMap,值为NULL
- 可用于存储某活动中中奖的用户ID,因为hash的key自带去重功能
sadd key1 value1
sadd key1 value2 value3
smembers key1 #展示结果无序
sismember key1 value4 #类似于contains功能,用于判断值是否存在
scard key1 #类似于count
5.zset 有序列表
- 类似于SortedSet HashMap的结合,使用元素的score值,能够对列表进行排序,并且值是唯一的,内部采用跳跃表进行实现
- 可以用于存储粉丝列表,或者带权重类型排序,可以score对应时间或者贡献值
zadd book 10.0 "aaa"
zadd book 8.8 "bbb"
zrange book fromindex toindex #获取范围内的书籍,按照score排序输出
zrevrange book fromindex toindex #逆序获取范围内的书籍
zcard book #类似于count
zscore book "aaa" #获取aaa书籍的权重
zrank book "bbb" #获取"bbb"书籍的排名
zrankbyscore book -inf 9.0 withscores #获取负无穷~9.0区间内的书籍,附带分数
zem book "aaa" #删除
其他
- 所有的数据结构都可以设置过期时间
- 过期是针对对象的,是一个HASH对象对其,而不是某一个子key
- 一个字符串对象,如果已经设置了过期时间,期间又通过set对内容进行更新了,过期机制就会失效