跳到主要内容
  1. 所有文章/
  2. Redis相关笔记/

Redis常用命令和数据类型

·📄 6129 字·🍵 13 分钟

Redis的数据类型 #

有五种常用数据类型:String、Hash、Set、List、SortedSet。以及三种特殊的数据类型:Bitmap、HyperLogLog、Geospatial ,其中HyperLogLog、Bitmap的底层都是 String 数据类型,Geospatial 的底层是 Sorted Set 数据类型。

五种常用的数据类型

1、String:String是最常用的一种数据类型,普通的key- value 存储都可以归为此类。其中Value既可以是数字也可以是字符串。使用场景:常规key-value缓存应用。常规计数: 微博数, 粉丝数。

2、Hash:Hash 是一个键值(key => value)对集合。Redishash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值。

3、Set:Set是一个无序的天然去重的集合,即Key-Set。此外还提供了交集、并集等一系列直接操作集合的方法,对于求共同好友、共同关注什么的功能实现特别方便

4、List:List是一个有序可重复的集合,其遵循FIFO的原则,底层是依赖双向链表实现的,因此支持正向、反向双重查找。通过List,我们可以很方面的获得类似于最新回复这类的功能实现。

5、SortedSet:类似于java中的TreeSet,是Set的可排序版。此外还支持优先级排序,维护了一个score的参数来实现。适用于排行榜和带权重的消息队列等场景

三种特殊的数据类型

1、Bitmap:位图,Bitmap想象成一个以位为单位数组,数组中的每个单元只能存0或者1,数组的下标在Bitmap中叫做偏移量。使用Bitmap实现统计功能,更省空间。如果只需要统计数据的二值状态,例如商品有没有、用户在不在等,就可以使用 Bitmap,因为它只用一个 bit 位就能表示 0 或 1。

2、Hyperloglog。HyperLogLog 是一种用于统计基数的数据集合类型,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。场景:统计网页的UV(即Unique Visitor,不重复访客,一个人访问某个网站多次,但是还是只计算为一次)。

要注意,HyperLogLog 的统计规则是基于概率完成的,所以它给出的统计结果是有一定误差的,标准误算率是 0.81%。

3、Geospatial主要用于存储地理位置信息,并对存储的信息进行操作,适用场景如朋友的定位、附近的人、打车距离计算等。

Redis-key #

redis命令手册

命令描述
Redis Type 命令返回 key 所储存的值的类型。
Redis PEXPIREAT 命令设置 key 的过期时间亿以毫秒计。
Redis PEXPIREAT 命令设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
Redis Rename 命令修改 key 的名称
Redis PERSIST 命令移除 key 的过期时间,key 将持久保持。
Redis Move 命令将当前数据库的 key 移动到给定的数据库 db 当中。
Redis RANDOMKEY 命令从当前数据库中随机返回一个 key 。
Redis Dump 命令序列化给定 key ,并返回被序列化的值。
Redis TTL 命令以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
Redis Expire 命令seconds 为给定 key 设置过期时间。
Redis DEL 命令该命令用于在 key 存在是删除 key。
Redis Pttl 命令以毫秒为单位返回 key 的剩余的过期时间。
Redis Renamenx 命令仅当 newkey 不存在时,将 key 改名为 newkey 。
Redis EXISTS 命令检查给定 key 是否存在。
Redis Expireat 命令EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
Redis Keys 命令查找所有符合给定模式( pattern)的 key 。

在redis中无论什么数据类型,在数据库中都是以key-value形式保存,通过进行对Redis-key的操作,来完成对数据库中数据的操作。

下面学习的命令:

exists key:判断键是否存在
del key:删除键值对
move key db:将键值对移动到指定数据库
expire key second:设置键值对的过期时间
type key:查看value的数据类型
ttl key:  通过TTL命令返回key的过期时间,一般来说有3种:
  1.当前key没有设置过期时间,所以会返回-1.
  2.当前key有设置过期时间,而且key已经过期,所以会返回-2.
  3.当前key有设置过期时间,且key还没有过期,故会返回key的正常剩余时间.
重命名 key : RENAME和RENAMENX
RENAME key newkey   修改 key 的名称
RENAMENX key newkey   仅当 newkey 不存在时,将 key 改名为 newkey 。
127.0.0.1:6379> keys * # 查看当前数据库所有key
(empty list or set)
127.0.0.1:6379> set name qinjiang # set key
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> move age 1 # 将键值对移动到指定数据库
(integer) 1
127.0.0.1:6379> EXISTS age # 判断键是否存在
(integer) 0 # 不存在
127.0.0.1:6379> EXISTS name
(integer) 1 # 存在
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> keys *
1) "age"
127.0.0.1:6379[1]> del age # 删除键值对
(integer) 1 # 删除个数


127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> EXPIRE age 15 # 设置键值对的过期时间

(integer) 1 # 设置成功 开始计数
127.0.0.1:6379> ttl age # 查看key的过期剩余时间
(integer) 13
127.0.0.1:6379> ttl age
(integer) 11
127.0.0.1:6379> ttl age
(integer) 9
127.0.0.1:6379> ttl age
(integer) -2 # -2 表示key过期,-1表示key未设置过期时间

127.0.0.1:6379> get age # 过期的key 会被自动delete
(nil)
127.0.0.1:6379> keys *
1) "name"

127.0.0.1:6379> type name # 查看value的数据类型
string

TTL命令 #

Redis的key,通过TTL命令返回key的过期时间,一般来说有3种:

  1. 当前key没有设置过期时间,所以会返回-1.
  2. 当前key有设置过期时间,而且key已经过期,所以会返回-2.
  3. 当前key有设置过期时间,且key还没有过期,故会返回key的正常剩余时间.

RENAME和RENAMENX #

RENAME key newkey修改 key 的名称 RENAMENX key newkey仅当 newkey 不存在时,将 key 改名为 newkey 。

五大常用数据类型 #

String #

String类似的使用场景:value除了是字符串还可以是数字,用途举例:

  • 计数器
  • 统计多单位的数量:uid:123666:follow 0
  • 粉丝数
  • 对象存储缓存
命令描述
Redis Setnx 命令只有在 key 不存在时设置 key 的值。
Redis Getrange 命令返回 key 中字符串值的子字符
Redis Mset 命令同时设置一个或多个 key-value 对。
Redis Setex 命令将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
Redis SET 命令设置指定 key 的值
Redis Get 命令获取指定 key 的值。
Redis Getbit 命令对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
Redis Setbit 命令对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
Redis Decr 命令将 key 中储存的数字值减一。
Redis Decrby 命令key 所储存的值减去给定的减量值(decrement) 。
Redis Strlen 命令返回 key 所储存的字符串值的长度。
Redis Msetnx 命令同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
Redis Incrby 命令将 key 所储存的值加上给定的增量值(increment) 。
Redis Incrbyfloat 命令将 key 所储存的值加上给定的浮点增量值(increment) 。
Redis Setrange 命令用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
Redis Psetex 命令这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
Redis Append 命令如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
Redis Getset 命令将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
Redis Mget 命令获取所有(一个或多个)给定 key 的值。
Redis Incr 命令将 key 中储存的数字值增一。

List #

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

首先我们列表,可以经过规则定义将其变为队列、栈、双端队列等

正如图Redis中List是可以进行双端操作的,所以命令也就分为了LXXX和RLLL两类,有时候L也表示List例如LLEN

命令描述
Redis Lindex 命令通过索引获取列表中的元素
Redis Rpush 命令在列表中添加一个或多个值
Redis Lrange 命令获取列表指定范围内的元素
Redis Rpoplpush 命令移除列表的最后一个元素,并将该元素添加到另一个列表并返回
Redis Blpop 命令移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
Redis Brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
Redis Brpoplpush 命令从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
Redis Lrem 命令移除列表元素
Redis Llen 命令获取列表长度
Redis Ltrim 命令对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
Redis Lpop 命令移出并获取列表的第一个元素
Redis Lpushx 命令将一个或多个值插入到已存在的列表头部
Redis Linsert 命令在列表的元素前或者后插入元素
Redis Rpop 命令移除并获取列表最后一个元素
Redis Lset 命令通过索引设置列表元素的值
Redis Lpush 命令将一个或多个值插入到列表头部
Redis Rpushx 命令为已存在的列表添加值

小结

  • list实际上是一个链表,before Node after , left, right 都可以插入值
  • 如果key不存在,则创建新的链表
  • 如果key存在,新增内容
  • 如果移除了所有值,空链表,也代表不存在
  • 在两边插入或者改动值,效率最高!修改中间元素,效率相对较低

应用:消息队列(Lpush Rpop),栈(Lpush Lpop)

Set #

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

命令描述
Redis Sunion 命令返回所有给定集合的并集
Redis Scard 命令获取集合的成员数
Redis Srandmember 命令返回集合中一个或多个随机数
Redis Smembers 命令返回集合中的所有成员
Redis Sinter 命令返回给定所有集合的交集
Redis Srem 命令移除集合中一个或多个成员
Redis Smove 命令将 member 元素从 source 集合移动到 destination 集合
Redis Sadd 命令向集合添加一个或多个成员
Redis Sismember 命令判断 member 元素是否是集合 key 的成员
Redis Sdiffstore 命令返回给定所有集合的差集并存储在 destination 中
Redis Sdiff 命令返回给定所有集合的差集
Redis Sscan 命令迭代集合中的元素
Redis Sinterstore 命令返回给定所有集合的交集并存储在 destination 中
Redis Sunionstore 命令所有给定集合的并集存储在 destination 集合中
Redis Spop 命令移除并返回集合中的一个随机元素

Hash #

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Set就是一种简化的Hash,只变动key,而value使用默认值填充。可以将一个Hash表作为一个对象进行存储,表中存放对象的信息。

Hash变更的数据user name age,尤其是用户信息之类的,经常变动的信息!Hash更适合于对象的存储,Sring更加适合字符串存储!

命令描述
Redis Hmset 命令同时将多个 field-value (域-值)对设置到哈希表 key 中。
Redis Hmget 命令获取所有给定字段的值
Redis Hset 命令将哈希表 key 中的字段 field 的值设为 value 。
Redis Hgetall 命令获取在哈希表中指定 key 的所有字段和值
Redis Hget 命令获取存储在哈希表中指定字段的值/td>
Redis Hexists 命令查看哈希表 key 中,指定的字段是否存在。
Redis Hincrby 命令为哈希表 key 中的指定字段的整数值加上增量 increment 。
Redis Hlen 命令获取哈希表中字段的数量
Redis Hdel 命令删除一个或多个哈希表字段
Redis Hvals 命令获取哈希表中所有值
Redis Hincrbyfloat 命令为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
Redis Hkeys 命令获取所有哈希表中的字段
Redis Hsetnx 命令只有在字段 field 不存在时,设置哈希表字段的值。

Zset(有序集合) #

不同的是每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大的排序。score相同:按字典顺序排序有序集合的成员是唯一的,但分数(score)却可以重复。

应用案例:

  • set排序 存储班级成绩表 工资表排序!
  • 普通消息,1.重要消息 2.带权重进行判断
  • 排行榜应用实现,取Top N测试
命令描述
Redis Zrevrank 命令返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
Redis Zlexcount 命令在有序集合中计算指定字典区间内成员数量
Redis Zunionstore 命令计算给定的一个或多个有序集的并集,并存储在新的 key 中
Redis Zremrangebyrank 命令移除有序集合中给定的排名区间的所有成员
Redis Zcard 命令获取有序集合的成员数
Redis Zrem 命令移除有序集合中的一个或多个成员
Redis Zinterstore 命令计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
Redis Zrank 命令返回有序集合中指定成员的索引
Redis Zincrby 命令有序集合中对指定成员的分数加上增量 increment
Redis Zrangebyscore 命令通过分数返回有序集合指定区间内的成员
Redis Zrangebylex 命令通过字典区间返回有序集合的成员
Redis Zscore 命令返回有序集中,成员的分数值
Redis Zremrangebyscore 命令移除有序集合中给定的分数区间的所有成员
Redis Zscan 命令迭代有序集合中的元素(包括元素成员和元素分值)
Redis Zrevrangebyscore 命令返回有序集中指定分数区间内的成员,分数从高到低排序
Redis Zremrangebylex 命令移除有序集合中给定的字典区间的所有成员
Redis Zrevrange 命令返回有序集中指定区间内的成员,通过索引,分数从高到底
Redis Zrange 命令通过索引区间返回有序集合成指定区间内的成员
Redis Zcount 命令计算在有序集合中指定区间分数的成员数
Redis Zadd 命令向有序集合添加一个或多个成员,或者更新已存在成员的分数

三大特殊数据类型 #

Geospatial(地理位置) #

使用经纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用。

有效经纬度

  • 有效的经度从-180度到180度。
  • 有效的纬度从-85.05112878度到85.05112878度。

指定单位的参数 unit 必须是以下单位的其中一个:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

关于GEORADIUS的参数

  • 通过georadius就可以完成 附近的人功能
  • withcoord:带上坐标
  • withdist:带上距离,单位与半径单位相同
  • COUNT n : 只显示前n个(按距离递增排序)
命令描述
Redis GEOHASH 命令返回一个或多个位置元素的 Geohash 表示
Redis GEOPOS 命令从key里返回所有给定位置元素的位置(经度和纬度)
Redis GEODIST 命令返回两个给定位置之间的距离
Redis GEORADIUS 命令以给定的经纬度为中心, 找出某一半径内的元素
Redis GEOADD 命令将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
Redis GEORADIUSBYMEMBER 命令找出位于指定范围内的元素,中心点是由给定的位置元素决定

Hyperloglog(基数统计) #

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。

因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

其底层使用string数据类型

什么是基数?

数据集中不重复的元素的个数。

应用场景:网页的访问量(UV):一个用户多次访问,也只能算作一个人。

传统实现,存储用户的id,然后每次进行比较。当用户变多之后这种方式及其浪费空间,而我们的目的只是计数,Hyperloglog就能帮助我们利用最小的空间完成。

命令描述
Redis Pgmerge 命令将多个 HyperLogLog 合并为一个 HyperLogLog
Redis Pfadd 命令添加指定元素到 HyperLogLog 中。
Redis Pfcount 命令返回给定 HyperLogLog 的基数估算值。

如果允许容错,那么一定可以使用Hyperloglog !

如果不允许容错,就使用set或者自己的数据类型即可 !

Bitmap(位图) #

使用位存储,信息状态只有 0 和 1。Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR,NOT以及其它位操作。

应用场景

签到统计、状态统计

发布与订阅 #

命令描述
Redis Unsubscribe 命令指退订给定的频道。
Redis Subscribe 命令订阅给定的一个或多个频道的信息。
Redis Pubsub 命令查看订阅与发布系统状态。
Redis Punsubscribe 命令退订所有给定模式的频道。
Redis Publish 命令将信息发送到指定的频道。
Redis Psubscribe 命令订阅一个或多个符合给定模式的频道。