官网对Redis常见的数据结构定义为:
??Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
五大数据类型(其余的api到中文官网看)
String(字符串)
基本介绍
??String可以说非常常见,程序员接触redis最先用到的应该就是String类型,使用该类型作为缓存。需要注意的是String类型的Value值可以是数字。常见使用场景是计数器,对象缓存等
命令实践
使用incr与decr命令实现自增与自减,实际场景用做浏览量等
字符串范围 range 替换,这里替换需要需要规则。
setex(set with expire) 设置过期时间 setnx(set if not exist) 不存在再设置(在分布式锁中会经常使用!) 批量创建key-value,批量获取key-value
重点 设置一个对象:set user:1 {name:zhangsan,age:3},设置一个user:1对象,值为json字符串来保存一个对象。 这里的设计是user:{id}:{filed},这样的设计在redis中是完全ok的了
先get后set 组合命令,可以用于更新操作
List(列表)
基本介绍
- 它实际是一个链表,before–Node–after
- 如果key不存在,创建新的链表;如果key存在,新增内容
- 如果移除了所有值,链表变空了,也代表不存在
- 在两边插入或修改值效率最高,中间元素,相对会低一点(LinkedList头插与尾插效率更高)
- 可以实现消息排队!消息队列 lpush rpop lpush rpop
- 在redis里面,list可以实现为栈,队列,阻塞队列
- 在String命令基础上,所有的list命令都以L开头代表list
命令实践
插入
移除元素 lpop,rpop
通过下标取值,第一个下标是0
查看list的长度 llen
移除指定的值,取关
String中有个trim方法,redis中有个ltrim命令可以实现截断
?
rpoplpush
lset {key} {index} {value},给list的某个索引位置设置值,替换值,是一个更新的操作。如果当前所以不存在就会失败
linsert,通过before/after来控制插入的位置
?
Set
基本介绍
- set的值是无序不重复的
- 在String命令基础上,所有的命令都以s开头代表set
命令实践
添加元素,查询元素,判断元素是否存在
获取集合中的某个元素,移除set集合中的指定元素
srandmexx 获取一个随机值
随机移除一个key:spop
将一个指定的值移动到另一个集合
- 差集:sdiff
- 交集:sinter
- 并集:sunion
脉脉,微博,微信等的共同关注,二度人脉等可以通过交并补来实现!
Hash
基本介绍
hash适合存储对象,经常变动的信息。String适合存储字符串即json 。redis的类型指的是后面的value。也就是说hash类型就是Map集合,它的value就是一个键值对相当于key:map。key本质和String类型没有太大区别,还是一个简单的String。
命令实践
Zset
基本介绍
- zset是在set的基础上多了一个score,类似于排序的东西
- 在String命令基础上,所有的list命令都以z开头代表zet
命令实践
添加一个元素,添加多个元素
使用场景:set排序 存储班级成绩表,工资表排序!
三种特殊类型
geospatial
基本介绍
geo底层实现原理是Zset,可以使用Zset命令来操作geo
命令实践
geoadd
- 作用:添加地理位置
- 规则:经度是有范围的,两极是无法直接添加(具体范围官网有),一般是程序一次性写入
- 当坐标超出命令时,会报错
geopos:获得坐标值,可以取多个也可以取一个
geodist:查看两点之间的距离,有一点不存在就会有问题,可以指定单位,具体看官网
georadius: 以给定的经纬度为中心,找出指定半径内的元素(必须在key中)
georadiusbymember: 查询指定元素周围元素(类似于附近场馆)
geohash:返回一个或多个元素的geohash表示,该命令返回11位
?
hyperloglog
基础知识
基数指的是不重复的元素,比如a集合是1,2,3,b几个是1,2.那么基数就是2,官方明确说明这里有误差,但是误差是可以接受的
简介
Redis2.8.9就有Hyperloglog这个数据结构,它是一种基数统计的算法。优点在于它占用的内存是固定的,2的64次方个元素,只需要12k的内存!相比于使用set(元素是唯一的)来实现一些功能,从内存角度,它是首选!
实际场景
网页的UV统计(一个人访问多次,也只算一次):
- 传统方式:set保存用户的id,然后统计set中的元素数量即可。这个方式耗内存太大,我们的问题是要计数,不是存放数据。
- redis:有0.81%的容错率,是可以接受的。
命令练习截图
bitmap
基础知识
Bitmaps是位图,是一种数据结构!都是操作二进制位来进行记录,就只有0跟1两个状态!! 应用场景:统计用户信息,活跃,不活跃!登录,未登录!打卡,未打卡!两个状态的,都可以使用Bitmaps!
命令练习截图
|