Redis之基本数据结构

若如初见. 提交于 2020-02-17 08:59:06


如果不能深入地了解系统,技术和框架背后的深层原理,很多问题无法理解到本质,更谈不上解决,临时抱佛脚也于事无补。

Redis可以做什么

  1. 记录帖子的点赞数,评论数,点击数
  2. 记录用户帖子id列表,便于快速显示用户的帖子列表
  3. 记录帖子的标题,摘要,作者和封面信息,用于列表页显示
  4. 记录帖子的点赞用户id列表,评论id列表,用于显示和去重计数
  5. 缓存近期热帖内容,减少数据库压力
  6. 如果帖子ID是自增的,使用redis分配帖子ID
  7. 帖子和收藏集的关系
  8. 记录总热榜,分类热榜帖子ID列表
  9. 缓存用户行为历史,进行恶意行为过滤

Redis5种基本数据结构

他们是:字符串+列表+集合+哈希+有序集合

String字符串

比如缓存用户信息,需要使用JSON序列化成字符串存入缓存。取用户信息时又会经过一次反序列化的过程。

redis是动态字符串,最大512M,小于1M时加倍现有空间,大于1M时加倍1M的空间

set key userinfo;
get key;

批量对多个字符串读写,节省网络耗时

mset key1 value1 key2 value2
mget key1 key2

设置key的过期时间-涉及到过期策略

##  设置5秒过期时间
set key1 value1
expire key1 5
##  合并set+expire
setex key2 5 value2
##  如果存在key3就不执行
setnx  key3 value3

计数功能

超过sigined long的最大值最小值,会报错

## 自增key1的值
set key1 50;
incr key1; 
## 合并指令
incrby key1 50;

list列表-相当于LinkedList

插入删除块,查找慢
作用:常用作异步队列使用。将需要延后处理的任务序列化成字符串放入redis,另一个线程从列表轮询进行执行。

队列-右边进左边出

rpush key1 value1 value2 value3
lpop key1
"value1"
lpop key1
"value2"
llen key1
1   

栈-右边进右边出

rpush key1 value1 value2 value3
rpop key1
"value3"
lpop key1
"value2"

ltrim截取

##截取这个区间的值(0表示第一个数 -1表示最后一个数)
ltrim start_index end_index   

快速例表:ziplist<——>ziplist<——>ziplist<——>ziplist<——>ziplist

hash字典-相当于hashmap

redis字典只能是字符串,与hashmap的重哈希方式不一样,redis为了提高性能,采用了渐进式的rehash策略
渐进式的rehash会保留新旧两个hash结构,然后在后续定时任务以及hash指令中,逐渐将旧内容迁移到新hash结构。
hash结构也可以存储用户信息,不同于String串一次性序列化整个对象,hash字典只序列化某些字段实现部分获取。

hset object key1 value1;
hset object key2 value2;
hgetall object;
hlen object;
hget object key1;
hincry object key1 1; //字典中单个key也可单独自增

set集合-相当于hashSet

用来存储中奖用户的id,因为有去重的功能,保证一个用户不会中将两次

sadd key1 value1;
sadd key1 value2;
spop key1;
smembers key1          //查询键为key1的所有值
"value1"
sismember key1 value1; //查询某value是否存在
scard key1             //查询键为key1值得个数

zset有序集合-相当于sortedSet

它是一个set保证value得唯一性,而且它可以给每个value赋一个排序权重
存储一对多得数据,并且对多的一方按照权重进行排序

  • 存储粉丝列表,value值是用户ID,score是关注时间。这样可以对粉丝列表按关注时间进行排序。
  • 存储班级学生成绩,value值是学生ID,score是他的考试成绩。对成绩按分数进行排序
zadd banji stu1 56;
zadd banji stu2 69;
zadd banji stu3 80;
zrem banji 80; //删除value
zrange banji 0 -1; //按score进行排序
zrevrange banji 0 -1; //按score逆序排序
zrangebyscore banji 60 90; //根据分值区间
zcard banji;   //相当于count

容器型数据结构通用规则

list/set/hash/zset

create if not exists
drop if no elements

注意:若某字符串设置了过期时间,若使用set修改它,那么它的过期时间会消失。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!