redis基本类型和使用方法的示例分析

60次阅读
没有评论

共计 11414 个字符,预计需要花费 29 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章主要介绍 redis 基本类型和使用方法的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

redis 存储数据的基本类型有:string(字符串类型)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合类型)。

依次做一些练习。redis 命令不区分大小写。

key 相关操作

127.0.0.1:6379  set key hello ##  设置
127.0.0.1:6379  set key1 world
127.0.0.1:6379  keys ke* ## keys 查询键名
1)  key1 
2)  key 
127.0.0.1:6379  del key1 ##  删除键值对
(integer) 1
127.0.0.1:6379  exists key ## 查询键名是否存在
(integer) 1 ## 存在返回 1
127.0.0.1:6379  exists key1
(integer) 0 ## 不存在返回 0
127.0.0.1:6379  type key ## 查询键值的类型  
string

字符串类型

127.0.0.1:6379  exists num 
(integer) 0
127.0.0.1:6379  incr num ##incr 一个不存在的值,先创建新值,赋值为 0,再自增 1. 院子操作。  对应的是 decr
(integer) 1
127.0.0.1:6379  set key hello
127.0.0.1:6379  incr key ## 无法对 string 自增
(error) ERR value is not an integer or out of range
127.0.0.1:6379  incrby num 3 ##increby 增加指定的数值,对应的是 decrby
(integer) 4
127.0.0.1:6379  incrbyfloat num 0.7 ## 增加浮点数
 4.7 
127.0.0.1:6379  append key   world!  ##append 追加字符
(integer) 12
127.0.0.1:6379  get key
 hello world! 
127.0.0.1:6379  strlen key ##strlen 字符串长度
(integer) 12
127.0.0.1:6379  mget key num ## mget 批量获取键值
1)  hello world! 
2)  4.7 
127.0.0.1:6379  mset key hi num 5.5 ##mset 批量设置
127.0.0.1:6379  mget key num
1)  hi 
2)  5.5 
127.0.0.1:6379  set foo bar 
127.0.0.1:6379  getbit foo 1 ##getbit 获取某一位二进制数值
(integer) 1
127.0.0.1:6379  setbit foo 22 0 ## 设置修改位值
(integer) 1
127.0.0.1:6379  get foo ## 修改成功
 bap 
127.0.0.1:6379  set foo bar
127.0.0.1:6379  set foo1 aar
127.0.0.1:6379  bitop or result foo foo1 ##bitop 位操作
(integer) 3
127.0.0.1:6379  get result
 car

GETBIT key offset

SETBIT key offset value

BITCOUNT key [start] [end] 获取键值中值为 1 的二进制位个数,start 和 end 表示字节位置

BITOP operation destkey key [key…] 对多个键值进行位运算,并将结果存储在 destkey 对应的键值中。支持的操作:AND、OR、XOR、NOT。

GETSET key newValue 原子操作,设置新值,返回原来的值。如果原值不存在,返回 nil。

SETEX key seconds value 设置键值对的失效时间是 seconds 秒。

SETNX key value put if absent,or do nothing。

SETRANGE key offset value 从 index 等于 offset 位置起,替换 length(value)个字符,替换为 value。如果 offset 超出范围,则中间补充 0x00。

GETRANGE key start end 获取指定返回的字符串,闭区间。end 超过长度,则取到字符串末尾。

MGET key [key …]

MSET key value [key value …]

MSETNX key value [key value …] 原子操作。如果在这一批 Keys 中有任意一个 Key 已经存在了,那么该操作将全部回滚,即所有的修改都不会生效。1 表示全部设置成功;0 表示都没有设置。

127.0.0.1:6379  getset foo hi ## 设置新值,返回旧值 nil
(nil)
127.0.0.1:6379  get foo
127.0.0.1:6379  setex foo 2 hello ## 设置键值对,2 秒失效
127.0.0.1:6379  get foo ## 没失效时,返回值
 hello 
127.0.0.1:6379  get foo ## 失效之后,返回 nil
(nil)
127.0.0.1:6379  set foo hello
127.0.0.1:6379  setrange foo 1 appy ## 替换 index= 1 之后的字符串
(integer) 5
127.0.0.1:6379  get foo
 happy 
127.0.0.1:6379  setrange foo 1 ee
(integer) 5 ## 返回修改后的长度
127.0.0.1:6379  get foo ## 替换两个字符
 heepy 
127.0.0.1:6379  setrange foo 8 day
(integer) 11 
127.0.0.1:6379  get foo
 heepy\x00\x00\x00day 
127.0.0.1:6379  get bar
(nil)
127.0.0.1:6379  setrange bar 2 ee ##bar 的值为 nil,补充两个 0x00
(integer) 4
127.0.0.1:6379  get bar
 \x00\x00ee 
127.0.0.1:6379  set key1 hello
127.0.0.1:6379  msetnx key1 hi key2 hi ##key2 不存在,不修改
(integer) 0
127.0.0.1:6379  mget key1 key2 ## key2 依然为 nil
1)  hello 
2) (nil)

hash

HSET key field value

HGET key field

HMSET key field value [field value …]

HMGET key field [field …]

HGETALL key

HEXISTS key field

HSETNX key field value 字段不存在时赋值。与 HSET 类型,区别在于,如果字段存在,HSETNX 不执行任何操作。

HINCRBY key filed increment 如果 key、field 不存在,自动创建,键值为 0,再增值。

HDEL key field [field…] 这是删除的是 key:field,不能直接删除 key。如果要删除 key,使用 DEL 命令。

HEYS key 只获取字段名

HVALS key 只获取字段值

HLEN key 获得字段数量

127.0.0.1:6379  HMSET g1class1 xiaoming 001 xiaohong 002 tom 003 hanmeimei 004
127.0.0.1:6379  HGETALL g1class1 
1)  xiaoming 
2)  001 
3)  xiaohong 
4)  002 
5)  tom 
6)  003 
7)  hanmeimei 
8)  004 
127.0.0.1:6379  HKEYS g1class1
1)  xiaoming 
2)  xiaohong 
3)  tom 
4)  hanmeimei 
127.0.0.1:6379  HLEN g1class1
(integer) 4
127.0.0.1:6379  HGET g1class1 xiaohong
 002 
127.0.0.1:6379  HSET g1class1 lilei 005 ##het 新值时,返回 1
(integer) 1
127.0.0.1:6379  hset g1class1 xiaohong 007 ## hset 更新值时,返回 0
(integer) 0
127.0.0.1:6379  hsetnx g1class1 tom 008 ## 已存在的值,不操作
(integer) 0
127.0.0.1:6379  hget g1class1 tom ## 已存在的值,更新不生效,还是 003
 003 
127.0.0.1:6379  hdel g1class1 ## 不能直接删除 key
(error) ERR wrong number of arguments for  hdel  command
127.0.0.1:6379  DEL g1class1 ## 使用 DEL 删除 key
(integer) 1
127.0.0.1:6379  hgetall g1class1 ## 查询为空
(empty list or set)

用途

用来存储分级数据。外部 key 作为 prefix,是第一级 key,hash 中的 key 作为第二级 key 使用。

存储含有多个属性的对象,如一篇博客的各种属性:标题,标签,分类等。修改某个属性,不用操作整个博客内容。

list

redis 列表类型内部是使用双向列表实现的,所以可以向 / 从两端添加 / 删除元素。

LPUSH key value [value …] 从左侧添加元素, 如果 key 不存在,初始化一个空列表,再添加。返回插入后,链表的个数。

LPUSHX key value 仅当指定的 Key 存在时,才在列表的左边插入 Value,否则将不会有任何操作发生。返回插入后,链表的个数。

RPUSH key value [value …] 从右侧添加元素

RPUSHX key value 仅当指定的 Key 存在时,才在列表的右边插入 Value,否则将不会有任何操作发生。返回插入后,链表的个数。

LPOP key 从两端弹出元素

RPOP key

LLEN key 获取列表中元素个数

LRANGE key start end 获取列表片段,左边在前,右边在后。起始索引为 0,最右边元素索引可以为 -1,右边第二个索引可以为 -2,以此类推。。。索引从左到右,如果 start 比 end 靠右,则返回空列表。end 值可以大于长度范围。

LREM key count value 从左边(count 0)开始,删除前 count 个值为 value 的元素;从右边(count 0)开始,删除前 |count| 个值为 value 的元素 ; 删除所有值为 value 的元素(count = 0)。返回实际删除元素的个数。

LINDEX key index 获取指定索引的元素值

LSET key index value 设置指定索引的元素值

LTRIM key start end 删除指定索引范围之外的所有元素。start 和 end 的规则与 lrange 的相同。

LINSERT key BEFORE|AFTER pivot value 从左到右查找 pivot,将 value 插在其前面 (BEFORE) 或者后面(AFTER)。返回插入后,元素总个数。

RPOPLPUSH source destination 删除 source 最右边的元素,插入到 destination 最左边。返回操作的元素。

127.0.0.1:6379  lpush num 1 2 ##  先 push 1,再 push 2
(integer) 2
127.0.0.1:6379  rpush num 3 4 ## 先 push 3,再 push 4
(integer) 4
127.0.0.1:6379  lrange num 0 -1 ## 从 0 开始,显示 4 个元素
1)  2 
2)  1 
3)  3 
4)  4 
127.0.0.1:6379  llen num
(integer) 4
127.0.0.1:6379  lrange num -1 -2 ##start 比 end 靠右,返回空列表
(empty list or set)
127.0.0.1:6379  lrange num -2 -1 ## 从右边第二到右边第一
1)  3 
2)  4 
127.0.0.1:6379  lpush num 3 4 3 
(integer) 7
127.0.0.1:6379  lrange num 0 -1
1)  3 
2)  4 
3)  3 
4)  2 
5)  1 
6)  3 
7)  4 
127.0.0.1:6379  lrem num 2 3
(integer) 2 ##  一共删除了两个
127.0.0.1:6379  lrange num 0 -1
1)  4 
2)  2 
3)  1 
4)  3 
5)  4 
127.0.0.1:6379  
127.0.0.1:6379  lrem num 0 4 ## 删除所有值为 4 元素
(integer) 2 ##  一共删除了两个
127.0.0.1:6379  lrange num 0 -1
1)  2 
2)  1 
3)  3 
127.0.0.1:6379  lrem num 2 3
(integer) 1 ## 只删除了一个元素
127.0.0.1:6379  lrange num 0 -1
1)  2 
2)  1 
127.0.0.1:6379  lpush num 1 3
(integer) 4
127.0.0.1:6379  linsert num BEFORE 1 4 ## 将 4 插入左边第一个 1 的前面
(integer) 5 ## 插入后,一共有 5 个元素
127.0.0.1:6379  lrange num 0 -1
1)  3 
2)  4 
3)  1 
4)  2 
5)  1 
127.0.0.1:6379  rpoplpush num num1 ## 转移一个元素
127.0.0.1:6379  lrange num1 0 -1
1)  1 
127.0.0.1:6379  rpoplpush num num1
127.0.0.1:6379  lrange num1 0 -1
1)  2 
2)  1 
127.0.0.1:6379  lrange num 0 -1 ##num 中转移走了 2 个元素
1)  3 
2)  4 
3)  1 
127.0.0.1:6379  lpushx num 5 ## 键名 num 存在,push 成功
(integer) 4
127.0.0.1:6379  lrange num2 0 -1 
(empty list or set)
127.0.0.1:6379  lpushx num2 1 ## 键名 num2 不存在,push 失败
(integer) 0
127.0.0.1:6379  lrange num2 0 -1
(empty list or set)

用途

列表页

set

redis 的 set 使用值为空的散列表(hash table)实现。

SADD key member [member …] 加入 set 中不存在的元素;返回成功加入的值的个数

SREM key member [member …] 删除 set 中存在的元素;返回成功删除的个数

SPOP key 随机选取一个元素,弹出并返回。如果 key 不存在,返回 nil。

SMEMBERS key 获取所有元素

SISMEMBER key member 判断元素是否在集合中,存在返回 1;key 或者 member 不存在,返回 0。

SCARD key 获取元素个数

SDIFF key1 [key2 …] 集合求差集,key1 中存在,key2 中不存在的

SINTER key [key …] 集合求交集

SUNION key [key …] 集合求并集

SDIFFSTORE destination key1 [key2 …] 集合求差集,并存入 destination 中。

SINTERSTORE destination key [key …] 集合求交集,并存入 destination 中。

SUNIONSTORE destination key [key …] 集合求并集,并存入 destination 中。

SRANDMEMBER key [count] 随机选取 count 个元素,不带参数 count 时,选取一个。count=0,返回空列表;count 0,选择 min(count, scard)个数据,且不重复,最多返回所有元素;count 0 选择 |count| 个元素,有可能重复。

SMOVE source destination member 原子性的将参数中的成员从 source 键移入到 destination 键所关联的 Set 中。因此在某一时刻,该成员或者出现在 source 中,或者出现在 destination 中。如果该成员在 source 中并不存在,该命令将不会再执行任何操作并返回 0,否则,该成员将从 source 移入到 destination。如果此时该成员已经在 destination 中存在,那么该命令仅是将该成员从 source 中移出。如果和 Key 关联的 Value 不是 Set,将返回相关的错误信息。返回 1 表示正常移动,0 表示 source 中并不包含参数成员。

127.0.0.1:6379  sadd set1 a b ## 添加两个不存在的元素
(integer) 2
127.0.0.1:6379  sadd set1 a c ## 添加成功一个元素 c
(integer) 1
127.0.0.1:6379  smembers set1 ## 获取所有元素
1)  c 
2)  b 
3)  a 
127.0.0.1:6379  srem set1 d b ## 删除成功一个元素
(integer) 1
127.0.0.1:6379  smembers set1
1)  c 
2)  a 
127.0.0.1:6379  sismember set1 a 
(integer) 1
127.0.0.1:6379  sadd set1 b
(integer) 1
127.0.0.1:6379  sadd set2 a d e 
(integer) 3
127.0.0.1:6379  sadd set3 c h j 
(integer) 3
127.0.0.1:6379  sdiff set1 set2 set3 ## 求差集,在 set1 中,同时不在 set2,set3 中的元素
1)  b 
127.0.0.1:6379  scard set1
(integer) 3
127.0.0.1:6379  sdiffstore set4 set1 set2 set3
(integer) 1
127.0.0.1:6379  smembers set4
1)  b 
127.0.0.1:6379  srandmember set1 0
(empty list or set)
127.0.0.1:6379  srandmember set1 1
1)  c 
127.0.0.1:6379  srandmember set1 2
1)  a 
2)  b 
127.0.0.1:6379  srandmember set1 5 ## 返回 min(5, 3)个元素, 且不重复
1)  c 
2)  a 
3)  b 
127.0.0.1:6379  srandmember set1 -5 ##  返回 5 个元素,可能重复
1)  a 
2)  b 
3)  c 
4)  c 
5)  c 
127.0.0.1:6379  spop set1
127.0.0.1:6379  smembers set1
1)  b 
2)  a 
127.0.0.1:6379  smembers set2
1)  d 
2)  a 
3)  e 
127.0.0.1:6379  smove set2 set1 c ##source 中不含移动的元素,不操作
(integer) 0
127.0.0.1:6379  smove set2 set1 e ## 移动一个元素到另一个集合
(integer) 1
127.0.0.1:6379  smembers set2
1)  d 
2)  a 
127.0.0.1:6379  smembers set1
1)  b 
2)  a 
3)  e

用途

唯一性数据集合,如某用户访问了哪些店铺等。

集合相关场景。每个店铺的访问用户是一个 set,查找同时访问多个店铺的用户群,查找访问一类店铺的用户群等。

sorted set

有序集合为每一个元素关联一个分数,并按照分数进行排序。虽然集合中的每个元素都是不相同的,但是它们的分数却可以相同。

ZADD key score member [score member …] 添加新元素,如果元素已经存在,则更新分数。score 支持整型和双精度浮点型。返回新添加的元素的个数(更新分数的不算)。inf 和 -inf 分别表示正无穷和负无穷。

ZINCRBY key increment member 增加一个元素的分数,increment 可以是负数。

ZSCORE key member 查询元素的分数

ZCARD key 获取集合中元素的个数

ZCOUNT key min max 指定分数范围内元素的个数,支持开闭区间。

ZRANGE key start end [WITHSCORES] 按照分数从小到大排序,获取排名在某个范围的元素列表,分数可选。闭区间,end 可为负数,与 lrange 参数要求一致。

ZREVRANGE key start end [WITHSCORES] 按照分数从大到小排序。

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 按分数从小到大顺序,返回分数在闭区间 [min,max] 的元素。可以指定开区间,在 min 前面加上 (,则表示(min, max]。支持 inf 和 -inf。offset 和 count 指,在获得的元素列表的基础上,向后偏移 offset 个元素,并且只获取前 count 个元素。

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] 按分数从大到小顺序,返回分数在闭区间 [min,max] 的元素。注意 max 和 min 的参数位置。

ZREM key member [member …] 删除一个或者多个元素

ZREMRANGEBYRANK key start end 按照范围排名删除元素,闭区间。索引从 0 开始。

ZREMRANGEBYSCORE key min max 按照分数排名,删除分数在 [min,max] 的元素,支持开区间。

ZRANK key member 按分数从小到大排序,获取元素 member 的排名,分数最小的排名是 0

ZREVRANK key member 按分数从大到小排序,获取元素 member 的排名,分数最大的排名是 0

ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] 计算 numkeys 个有序集合的交集,存储在有序集合 destination 里面,返回 destination 的元素个数。

WEIGHTS 参数设置每个集合的权重,每个集合在参与计算时,元素的分数会被乘上该集合的权重。

AGGREGATE 表示 destination 中元素分数的计算方式:

AGGREGATE 为 SUM(默认值)时,则 destination 中元素的分数,是每个参与计算的集合中该元素分数的和。

AGGREGATE 为 MAX 时,则 destination 中元素的分数,是每个参与计算的集合中该元素分数的最大值。

AGGREGATE 为 MIN 时,则 destination 中元素的分数,是每个参与计算的集合中该元素分数的最小值。

ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] 与上面类似。

127.0.0.1:6379  zadd zset1 10 sh 40 bj ## 添加 2 个元素
(integer) 2
127.0.0.1:6379  zadd zset1 20 sh 50 hz 80 cd ## 更新 1 个,添加 2 个
(integer) 2
127.0.0.1:6379  zscore zset1 sh ## 获取 sh 的分数,已更新为 20
127.0.0.1:6379  zrange zset1 1 -1 ## 从第二个元素开始的所有元素
1)  bj 
2)  hz 
3)  cd 
127.0.0.1:6379  zrange zset1 0 -1 withscores ## 获取全部元素
1)  sh 
2)  20 
3)  bj 
4)  40 
5)  hz 
6)  50 
7)  cd 
8)  80 
127.0.0.1:6379  zadd zset1 inf zy ## 添加正无穷
(integer) 1
127.0.0.1:6379  zrangebyscore zset1 (50 inf withscores ##  分数大于 50 的元素
1)  cd 
2)  80 
3)  zy 
4)  inf 
127.0.0.1:6379  zrangebyscore zset1 50 inf withscores limit 1 2 
##  分数大于等于 50 的元素,从第二个开始,取 2 个
1)  cd 
2)  80 
3)  zy 
4)  inf 
127.0.0.1:6379  zincrby zset1 5 hz ##  给元素 hz 加 5 分
 55  
127.0.0.1:6379  zrangebyscore zset1 (50 inf ##  添加成功
1)  hz 
2)  cd 
3)  zy 
127.0.0.1:6379  zrange zset1 0 -1 WITHSCORES ## 查询所有元素
 1)  sh 
 2)  20 
 3)  bj 
 4)  40 
 5)  hz 
 6)  55 
 7)  cd 
 8)  80 
 9)  zy 
10)  inf 
127.0.0.1:6379  zcount zset1 0 inf ## 获取元素个数
(integer) 5
127.0.0.1:6379  zcount zset1 (55 inf ## 大于 55 元素个数
(integer) 2
127.0.0.1:6379  zrem zset1 zy ## 删除 zy
(integer) 1
127.0.0.1:6379  zrange zset1 0 -1 ##  剩下四个
1)  sh 
2)  bj 
3)  hz 
4)  cd 
127.0.0.1:6379  zremrangebyrank zset1 1 2 ##  按照排名,删除第 2 名到第 3 名
(integer) 2
127.0.0.1:6379  zrange zset1 0 -1 ##  只剩下 2 个
1)  sh 
2)  cd 
127.0.0.1:6379  zadd zs1 1 a 2 b 
(integer) 2
127.0.0.1:6379  zadd zs2 10 a 20 b
(integer) 2
## zs1 和 zs2 取交集,zs1 的权重为 1,zs2 的权重为 0.5,所以 a 的结果分数是 1 +10*0.5=6
127.0.0.1:6379  zinterstore zs3 2 zs1 zs2 WEIGHTS 1 0.5 AGGREGATE sum
(integer) 2
127.0.0.1:6379  zrange zs3 0 -1 withscores
1)  a 
2)  6 
3)  b 
4)  12

用途

排序的场景。如按照博客访问量排序文章列表。key 是用户 id,set 中的数据是文章 id,每个文章 id 关联一个 score(访问量)。

与列表的比较

都可以获取某一范围的元素

列表类型通过链表实现,获取两端数据速度快,元素增多后,访问中间数据速度较慢。所以适合“新鲜事”和“日志”一类的场景。

有序集合是通过散列表和跳跃表实现的,所以读取位于中间部分的数据的速度也很快。时间复杂度 O(log(N))。

列表不能简单的调整某个元素的位置,有序集合可以。(修改元素的分数)

以上是“redis 基本类型和使用方法的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计11414字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)