redis数据类型
2023年8月17日大约 4 分钟
redis数据类型
redis简介
什么是Redis?
- Redis本质上是一个Key-Value类型的内存数据库,很像memcached。
- 整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。
- 因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB
redis特点
- redis比memcached优点
- 数据类型:redis支持五中数据类型, memcached所有的值均是简单的字符串
- value大小限制:redis单个value的最大限制是512M,memcached只能保存1MB的数据
- 持久化:redis可以持久化,memcached不支持持久化
- redis为什么快?
- 纯内存操作
- 单线程避免上下文切换
- 非阻塞IO多路复用机制
- redis缺点
- 内存限制,不能用作海量数据存储
- 注:如果需要存储海量数据,可以使用MongoDB
常识
磁盘
- 寻址:ms
- 带宽:G/M(单位时间有多少数据流量)
内存
- 寻址:ns
- 带宽:很大
mysql 数据库表变大, 性能下降?
如果有索引,增删改变慢
1个或少量查询命中索引依然很快
并发量大的时候会受到磁盘带宽影响速度
数据在磁盘和内存中的体积不一样, 同样的数据放在内存中有指针等概念,内存会有一些压缩,而磁盘中没有
redis 和memcache 的主要区别在与memcache中没有数据结构, 如果客户端想要取回类型中的某个元素,memacache需要返回values中的所有元素,server端网卡io有限制,celient端要有你实现的代码去解码
redis中server对每种数据都有自己的方法 。如图
Image
数据类型
字符串
字符串value数据结构类似于数组,采用与分配容易空间来减少内存频繁分配
当字符串长度小于1M时,扩容就是加倍现有空间
如果字符串长度操作1M时,扩容时最多扩容1M空间,字符串最大长度为 512M
字符串操作:set get setrange getrange mset mget getset
数值操作: incrby decrby incrbyflloat decrbyfloat
应用场景:缓存,共享session等
List
- 表的数据结构是双向链表,这意味着插入和删除的时间复杂度是0(1),索引的时间复杂度位0(n)
- 2.当列表弹出最后一个元素后,该数据结构会被自动删除,内存被回手
- lpush rpush lpop rpop lrange blpop brpop(阻塞弹出) ltrim(删除两端的元素)
- 应用场景:(队列,栈)
Image
Hash
- redis中的字典也是HashMap(数组+列表)的二维结构
- 不同的是redis的字典的值只能是字符串
- hset hget hkeys hvals hgetall hgetall hincrbyfloat
- 使用场景 商品详情页 点赞、收藏
Set
- redis中的集合相当于一个特殊的字典,字典的所有value都位null
- 当集合中的最后一个元素被移除后,数据结构会被自动删除,内存被回收
- 操作:sadd spop sdiff sunion s
- 应用场景:利用去重功能,如中将用户,签到用户等
Zset
- zset一方面是一个set,保证了内部的唯一性
- 另一方面它可以给每一个value赋予一个score,代表这个value的权重
- zset内部实现用的是一种叫做“跳跃列表”的数据结构(跳跃表+hash)
- zset最后一个元素被移除后,数据结构就会被自动删除,内存也会被回收
- 操作:: zadd zpop zrange zrevrange(反转)
- 应用场景:排行榜,粉丝列表,关注列表
Bitmap
Bitmap 即位图数据结构,都是操作二进制位来进行记录,只有0 和 1 两个状态
两个状态的,都可以使用 Bitmaps
应用场景
Image
HyperLogLogs(基数统计)
基数:举个例子,A = {1, 2, 3, 4, 5}, B = {3, 5, 6, 7, 9};那么基数(不重复的元素)= 1, 2, 4, 6, 7, 9; (允许容错,即可以接受一定误差)
优势:这个结构可以非常省内存的去统计各种计数,
应用场景:比如注册 IP 数、每日访问 IP 数的页面实时UV、在线用户数,共同好友数等。
Geospatial(地理位置)
- Redis 的 Geo 在 Redis 3.2 版本就推出了! 这个功能可以推算地理位置的信息: 两地之间的距离, 方圆几里的人