AIOps 一场颠覆传统运维的盛筵
898
2022-10-20
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流程:
安装后的执行文件:
发表评论
暂时没有评论,来抢沙发吧~