Redis整体数据结构和大致使用场景介绍

网友投稿 898 2022-10-20

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

Redis整体数据结构和大致使用场景介绍

今天先简单介绍下Redis整个结构和大致利用场景,后续会讲解redis相关实战和多实例运维工作,敬请期待。好啦,开始了,如下

Redis中的值:string字符串、hash哈希、list列表、set集合、zset有序集合、Bitmaps位图、HyperLogLog(大数据基数统计)、GEO地理信息定位

下图是2009年谷歌公司给出的各层级硬件的执行速度:

简单知识罗列下:

单线程Redis为什么能支持万次请求每秒呢?

1、内存响应时长大约100纳秒( 1纳秒 =0.000 000 001秒)

2、非阻塞I/O,使用epoll作为I/O多路复用技术。(有时间可以去研究下netty源码,对I/O这块知识是高聚合学习)

3、redis自身事件处理模型讲epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间

4、单线程不需要线程切换和竞态产生消耗

5、单线程可以简化数据结构和算法的实现,减少锁之类的并发性能损耗

前提要求:redis只能面向执行场景非常快速的

缺点:因为单线程,如果某个命令执行过长,会造成其他命令的阻塞。

redis的数据结构就不详细说了,有空的同学可以去看下黄建宏的关于redis源码的书籍,这位90年的同学年轻的吧?

接下来简单记录一些重要的指令,具体指令请到http://redisdoc.com/index.html学习

①字符串命令:

set key value [ex seconds] [px milliseconds] [nx|xx] /px 毫秒;nx 键必须不存在才可以添加;xx键必须存在才可以设置成功,用于更新

setex key seconds value  //几秒后失效

setnx key value  //这个可以当做分布式锁来使用

mset key value [key value key value ...]  //批量设置值

mget key [key key ...]  //可以减少get指令带来的多次网络世界和命令世界的损耗,以1000次get比来算,十倍多的性能差距

setrange key offeset value  //对key所对应的值进行位的数据替换

getrange key start end

内部编码

int 8个字节长整型

embstr 小于等于39个字节的字符串

raw 大于39个字节的字符串

key命名--> (业务名:对象名:id:[属性]) 等类似这种

②哈希:

hset key field value

hget key field

hdel key field [field field ...]

hlen key  //计算field个数

hmget key field [field field ...]

hmset key field value [field value field value ...]

hexists key field

hkeys key  //获取所有的field

hvals key  //获取field对应的所有value

hgetall key  //获取所有的field-value,可以使用hscan

内部编码

ziplist  哈希元素个数小于默认512个,同时值都小于默认的64字节

hashtable  ziplist无法满足的时候使用

③列表:

lrange key 0 -1//获取所有元素。索引下标从左到右分别是0到N-1,从右到左分别是-1到-N

lrem key count value  //count>0从左到右,删除最多count个元素;count<0,从右到左,删除最多count绝对值个元素;count=0,删除所有

ltrim key start end  //不在范围内的索引对应的值删除

lset key index newValue  //修改key的值

linsert key before value newValue  //在value之前插入newValue

blpop key [key key ...] timeout  //timeout时间内监听key列表里是否有值,有就返回,提供timeout=0为客户端一直阻塞下去。 从左到右由于一个key有数据之间弹出并且返回不再执行下面的步骤

brpop key [key key ...] timeout

内部编码:

ziplist  哈希元素个数小于默认512个,同时值都小于默认的64字节

linkedlist  ziplist无法满足的时候使用

使用场景

lpush+brpop组合:生产者生产数据,多个消费者客户端阻塞轮抢列表尾部数据。多个客户端保证了消费的负载均衡和高可用hash+列表组合:比如分页查询。基础数据存到hash里,列表存业务数据实现分页等数据查询。需要注意事务

目前数据结构可以组合的业务场景如下:

lpush+lpop=栈lpush+rpop=队列lpush+ltrim=有限集合lpush+brpop=消息队列

④集合

一个集合最多存储2的32次方-1个元素,无序并且不重复元素

支持增删改查,取交集并集或者差集

指令:

sadd key element [element element ...]

srem key element [element element ...]  //删除元素

scard key //计算元素个数 ,复杂度O(1),redis内部有一个变量直接存储元素个数

sismember key element   //判断元素是否在集合中

srandmember key [count]  //随机返回count个元素 ,默认count为1

spop key //随机弹出元素

smembers key  //输出所有元素,无序的

sinter key [key ...]  多个key的交集

sunion key [key ...] 并集

sdiff key [key ...] 差集

sinterstore  key2  [key ...]  多个key的差集保存到 key2

内部编码:

intset:集合里元素都是整数并且元素个数小于默认512个

hashtable:intset无法满足的时候使用

使用场景:

sadd+sinter   比如微博里用户喜欢关注哪种类型新闻,这种不同用户之间有并集差集等集合关系的。需要注意事务spop/srandmember (随机抽奖)

⑤有序集合

zadd key score member [score member ...] [nx | xx] [ch(返回此次操作后集合元素变化的个数)][incr]  //可以按照score来排序

zcard key 计算成员个数

zscore key member 计算摸个成员分数

zrank key member 从低到高排序

zrevrank key member 从高到底排序

zrem key member [member ...]删除成员

zincrby key increment member 增加成员 increment 分

zrange key start end [withscores]  从低到高按照分值排序范围内的成员,加上withscores会返回成员加分数

zrevrange key start end [withscores]  从高到低按照分值排序范围内的成员

内部编码:

ziplist,元素个数小于128个,每个元素值为64字节

skiplist ,ziplist不满足的时候使用

使用场景

点赞排行榜等统计性的排行榜

安装redis流程:

安装后的执行文件:

上一篇:香港:全年基本消费物价通胀率预测维持2%
下一篇:外交部:坚定支持索马里联邦政府维护国家统一安全和稳定的努力
相关文章

 发表评论

暂时没有评论,来抢沙发吧~