Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding

Redis实现list时候做出的优化

ziplist(压缩链表,元素少的情况),可更好的节省空间

为什么要压缩:redis上有很多的key,可能某些key的value是hash,此时如果key 特别多,hash特别多,hash不在的情况下,尽量去压缩使整体占用的内存更小

list——(内部编码:quicklist)

每个元素是一个ziplist,把空间和效率兼顾到.相当于是链哈希表那种,一个后面挂一个

Object encoding key查询内部编码

redis单线程模型

redis是单线程处理模型,但是他其实也具有多线程,多线程在处理网络IO,

快的原因:

1.redis访问内存,数据库访问硬盘

2.redis核心功能比数据库核心功能简单(数据库对于数据插入删除查询,都有更复杂的功能支持,入针对插入删除,数据库的各种约束,都会使数据库做额外的工作

3.单线程模型,避免了一些不必要的线程竞争开锁

redis每个基本操作都是短平快,简单操作内存,不去消耗cpu,搞多线程,也不会有多大的提升

4.处理网络IO的时候,使用了epoll这样的IO多路复用(一个线程管理多个socket)机制

针对TCP来说,服务器这边每次都要服务一个客户端,都要给这个客户端安排个socket,一个线程可以管理多个socket

IO多路复用的前提是:很多情况客户端与服务器通往没那么频繁(同一时刻只有少数socket是活跃的),此时socket大部分是静默的,上面是没有数据要去传输的

Linux提供的IO多路复用

select

poll

epoll(2006年之后,最高的机制,事件通知

Redis中String类型介绍——所有的key都是字符串

按照二进制数据的方式存储->不仅存储文本数据,整数,文本字符串,JSON,XML,二进制数据(图片,视频),不涉及任何编码转换.

SET KEY VALUE [EX 10] [NX|XX]:
(相当于set key value expire key 10)设置值的同时,设置过期时间

NX:如果当前值存在,则不去设置,key不存在才去设置(不存在了)

XX:如果当前值不存在,则不去设置,存在则去设置

FLUSHALL

删除内部所有的库,相当于初始化

MSET一次性设置所有的key

SETNX:不存在才能设置,存在则设置失败

SETEX:指定key,后面是秒数

SETPX:——毫秒数据

MGET一次性得到多个key

基础操作运算

incr:针对value+1

incrby:针对value+n

decr:针对value-1

decrby:针对value-n

incrbyfloat:value+-小数

以上操作时间复杂度,都是O(1):

redis是单线程模型,所以多个线程针对同一个key进行incr操作,不会引起“线程安全”问题

字符串,也支持一些常用操作

拼接,获取修改字符串的部分内容,获取字符串长度

append:key已经存在,并且是一个string,命令会将value追加到原先string后面,如果key不

存在,则效果等同于set命令

getrange:获取字符串中指定范围, get range key 0 -1 ,redis支持负数(-1指倒数第一个元素,下标为len-1的元素(可以这么记 -1就是len -1))

setrange:返回值,是替换后,新的字符串长度,从...开始,setrange针对不存在的key,也是可以进行操作的,不过会把offset之前的内容填充成0x00

String内部编码

int:8个字节长整形

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

raw:大于39字节的字符串

redis根据当前类型和动态决定哪种内部的编码实现

Object encoding key:查找当前内部编码

获取当前key对应的string长度

ctrl+s,有时候可能是冻结画面

ctrl+q,有时候可能是解除冻结

JAVA中char使用的unicode,一个汉字两个字节

            String         utf8           一个汉字三个字节

Redis存储小数,本质上是当做字符串来存储,这也意味着每次算术运算,都需要把字符串转换成小数,进行运算,结果再去转回字符串中保存

Redis存储热点数据

这个方式,结合业务场景有很多种方式

Redis找不到,从mysql那里面去找,找到后写回Redis(但是这样也有一个问题,就是Redis里面的数据不就会越来越大了吗.,所以我们在把Redis数据书写之后,给Key设置一个过期时间,Redis内存不足的时候,提供了淘汰策略


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
19天前
|
消息中间件 负载均衡 NoSQL
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
18 0
|
13天前
|
NoSQL Java Redis
Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
|
13天前
|
存储 NoSQL Redis
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
|
1月前
|
存储 NoSQL 安全
Redis第六弹-List列表-(相当于数组/顺序表)Lpush key element-一次可以插入多个元素(假如key已经存在,并且key对应的value并非是list,则会报错)
Redis第六弹-List列表-(相当于数组/顺序表)Lpush key element-一次可以插入多个元素(假如key已经存在,并且key对应的value并非是list,则会报错)
|
2月前
|
Java
Java Object 类
5月更文挑战第16天
|
16天前
|
Java
Java中的Object类 ( 详解toString方法 | equals方法 )
Java中的Object类 ( 详解toString方法 | equals方法 )
|
2月前
|
存储 算法 Java
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
【5月更文挑战第17天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
30 2
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
|
1月前
|
Java
【Java】Object类简单解析
【Java】Object类简单解析
16 1
|
1月前
|
前端开发 JavaScript Java
Java基础10-深入理解Class类和Object类(二)
Java基础10-深入理解Class类和Object类(二)
24 5
|
1月前
|
Java C++
Java基础10-深入理解Class类和Object类(一)
Java基础10-深入理解Class类和Object类(一)
25 4