当前位置: 首页 > news >正文

【Redis】02 基本数据类型

文章目录

  • String类型
    • 简述
    • 查看key值 keys
    • 基本赋值取值 SET/GET/APPEND/STRLEN
    • 递增递减 INCR、DECR
    • 批量操作key值
  • List列表类型
    • lpush/lpop/lrange
  • Set集合类型
    • SADD/SCARD/SISMEMBER/SMEMBERS
    • SPOP/SREM/**SRANDMEMBER**
    • sinter/sunion/sdiff
    • sunionstore/sinterstore/sdiffstore
    • 总结
  • Hash哈希类型
    • HSET/HGET/HEXISTS/HLEN/HDEL
    • HSETNX/HGETALL/HKEYS/HVALS/HMGET
  • Zset有序集合类型
    • ZAdd/Zcard/**ZCOUNT/ZREM···**
    • 博客学习内容

String类型

简述

String字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制存储格式,在value中最大能保存的数据长度为512M;

大多数适用于的时候都是String类型:80%;

面试造飞机,实践做轮子;

查看key值 keys

  1. keys *

  1. del删除key值
127.0.0.1:6379> del key1
(integer) 1
127.0.0.1:6379> keys key1
(empty list or set)
127.0.0.1:6379> keys key2
1) "key2"
127.0.0.1:6379> del key2
(integer) 1
127.0.0.1:6379> keys key2
(empty list or set)
127.0.0.1:6379>

基本赋值取值 SET/GET/APPEND/STRLEN

  1. 赋值命令 set,使用set 对 key 进行赋 value;

set key value 时间复杂度 O(1);

如果key中有内容,就覆盖掉原来的值,返回OK

  1. 取值命令 get,使用get 对 key 的值 进行获取

get key ,时间复杂度 O(1)

使用get命令只能获取 String类型的内容,如果不是就会发生报错

  1. 获取并覆盖命令GETSET

时间复杂度 O(1),getset key value

getset的设置该Key为指定的Value,同时返回该Key的原有值。

  1. 追加字段 append key value

在key的值后面再追加一个value

  1. 查询字段长度 strlen

strlen key 获取字段的长度,等同于C库里的strlen,返回integer类型数据

  1. setnx key value 判断key的值是否存在,如果为null 则设置数据

递增递减 INCR、DECR

  1. 递增数字 INCR key

key存在的情况下 递增key,不存在会ncr之后其值为1

  1. 递减数字 DECR key

  1. 增加指定的整数 INCRBY key increment
  2. 减少指定的整数 DECRBY key decrement
127.0.0.1:6379> get inkey
"31"
127.0.0.1:6379> incrby inkey 3
(integer) 34
127.0.0.1:6379> decrby inkey 4
(integer) 30
127.0.0.1:6379> incr inkey
(integer) 31
127.0.0.1:6379> decr inkey
(integer) 30
127.0.0.1:6379>

批量操作key值

msetmgetmsetnx

  1. mset 批量插入数据
  2. mget 批量获取数据
  3. msetnx 批量使用 setnx关键字,如果批量中有一个为false 整体则会失败返回0
127.0.0.1:6379> mset key1 "hello" key2 "world"
OK
127.0.0.1:6379> mget key key2 mykey
1) (nil)
2) "world"
3) "hello world"
127.0.0.1:6379> mget key1 key2 mykey
1) "hello"
2) "world"
3) "hello world"
127.0.0.1:6379> msetnx key1 hello1 key2 world1 key3 "!"
(integer) 0
127.0.0.1:6379> mget key1 key2 key3
1) "hello"
2) "world"
3) (nil)
127.0.0.1:6379> msetnx key3 mm key4 ff
(integer) 1
127.0.0.1:6379> mget key3 key4
1) "mm"
2) "ff"
127.0.0.1:6379>

List列表类型

List类型列表是有序的,是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。

List中可以包含的最大元素数量是4294967295。

lpush/lpop/lrange

  1. lpush key value [插入]

自左侧 依次向list中添加数据;rpush 则是从右侧

  1. lpop key [弹出]

依次移除数据并显示剩下的内容,同push一样

  1. lrange 查看list的内容

查看指定的list内容,lrange list 0 -1 查询所有的内容

127.0.0.1:6379> lpush list aa1l
(integer) 3
127.0.0.1:6379> rpush list aa1r
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "a11"
3) "a1"
4) "aa1r"
127.0.0.1:6379>
  1. LPUSHX命令 /RPUSHX命令

仅有当参数中指定的Key存在时,该命令才会在其所关联的List插入参数中给出的Value,否则将不会有任何操作发生。 L从头部插入,R从尾部插入

  1. LLEN key 获取列表中元素的个数
  2. LREM key count value 删除列表中指定的值
  3. LSET key index value 设置指定索引的元素值
  4. LINDEX key index 获取指定索引的元素值
  5. LINSERT key BEFORE|AFTER pivot value 向列表中插入元素
127.0.0.1:6379> llen list
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "aa2l"
2) "aa1l"
3) "a11"
4) "a1"
5) "aa1r"
127.0.0.1:6379> lrem list 1 a1
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "aa2l"
2) "aa1l"
3) "a11"
4) "aa1r"
127.0.0.1:6379> lrem list 1
(error) ERR wrong number of arguments for 'lrem' command
127.0.0.1:6379> lset list 1 aa1l
OK
127.0.0.1:6379> lrange list 0 -1
1) "aa2l"
2) "aa1l"
3) "a11"
4) "aa1r"
127.0.0.1:6379> lset list 0 aa1l
OK
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "aa1l"
3) "a11"
4) "aa1r"
127.0.0.1:6379> lrem list 1 aa1l
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "a11"
3) "aa1r"
127.0.0.1:6379> lindex list 1
"a11"
127.0.0.1:6379> lindex list 0
"aa1l"
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "a11"
3) "aa1r"
127.0.0.1:6379> linsert list after a11 a22
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "a11"
3) "a22"
4) "aa1r"
127.0.0.1:6379>
  1. RPOPLPUSH source destination 将元素从一个列表转到另一个列表
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "a11"
3) "a22"
4) "aa1r"
127.0.0.1:6379> rpoplpush list listr
"aa1r"
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "a11"
3) "a22"
127.0.0.1:6379> lrange listr 0 -1
1) "aa1r"
127.0.0.1:6379>

Redis链表经常会被用于消息队列的服务,以完成多程序之间的消息交换。

一个应用程序正在执行LPUSH操作向链表中添加新的元素,我们通常将这样的程序称之为"生产者(Producer)",而

一个应用程序正在执行RPOP操作从链表中取出元素,我们称这样的程序为"消费者(Consumer)"。

如果此时,消费者程序在取出消息元素后立刻崩溃,由于该消息已经被取出且没有被正常处理,那么我们就可以认为该消息已经丢失,由此可能会导致业务数据丢失,或业务状态的不一致等现象的发生。

然而通过使用RPOPLPUSH命令,消费者程序在从主消息队列中取出消息之后再将其插入到备份队列中,直到消费者程序完成正常的处理逻辑后再将该消息从备份队列中删除。

同时我们还可以提供一个守护进程,当发现备份队列中的消息过期时,可以重新将其再放回到主消息队列中,以便其它的消费者程序继续处理。

Set集合类型

Set集合是无序的,Set集合中不允许出现重复的元素,List列表可以出现重复的数据;

SADD/SCARD/SISMEMBER/SMEMBERS

  1. sadd 添加数据,可以添加多个;
  2. scard 统计数据‘
  3. sismember key 查找有没有这个数据,又返回 1 无返回 0;
  4. smembers 列出这个Set集合中的所有数据;
127.0.0.1:6379> sadd myset set1
(integer) 1
127.0.0.1:6379> sadd myset set2
(integer) 1
127.0.0.1:6379> sadd myset set3 set4 set5
(integer) 3
127.0.0.1:6379> get myset
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> scard myset
(integer) 5
127.0.0.1:6379> SMEMBERS myset
1) "set1"
2) "set2"
3) "set3"
4) "set4"
5) "set5"
127.0.0.1:6379> sismember myset set1
(integer) 1
127.0.0.1:6379> sismember myset s
(integer) 0
127.0.0.1:6379> sismember myset
(error) ERR wrong number of arguments for 'sismember' command
127.0.0.1:6379>

SPOP/SREM/SRANDMEMBER

  1. spop

弹出元素,格式为 spop key count,随机弹出指定数量的元素,具有随机性,并对其进行显示;

  1. srem

删除元素,格式为srem key member,删除指定的元素

127.0.0.1:6379> spop myset 2
1) "set2"
2) "set4"
127.0.0.1:6379> SMEMBERS myset
1) "set1"
2) "set3"
3) "set5"
127.0.0.1:6379> srem myset set3
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "set1"
2) "set5"
127.0.0.1:6379>
  1. **SRANDMEMBER **key [count]

等同于spop,区别是 不会删除元素

  1. **SMOVE **source destination member 将元素从一个集合转到另一个集合

sinter/sunion/sdiff

  1. sinter

交集获取相同的数据,结合SQL中的 inner join 理解

  1. sunion

并集获取大家都有的数据,结合SQL的union 理解

  1. sdiff

比较两个集合的内容,把不同的地方体现出来

127.0.0.1:6379> sadd mysetr set1 set2 set3 set4
(integer) 4
127.0.0.1:6379> smembers myset
1) "set1"
2) "set5"
127.0.0.1:6379> smembers mysetr
1) "set1"
2) "set2"
3) "set3"
4) "set4"
127.0.0.1:6379> sdiff myset mysetr
1) "set5"
127.0.0.1:6379> sinter myset mysetr
1) "set1"
127.0.0.1:6379> sunion myset mysetr
1) "set1"
2) "set5"
3) "set2"
4) "set3"
5) "set4"
127.0.0.1:6379> sadd myset set6
(integer) 1
127.0.0.1:6379> sdiff myset mysetr
1) "set5"
2) "set6"
127.0.0.1:6379>

sunionstore/sinterstore/sdiffstore

将取出来的交集和并集放到一个集合中

127.0.0.1:6379> sunionstore mysetunion myset mysetr
(integer) 6
127.0.0.1:6379> smembers mysetunion
1) "set1"
2) "set5"
3) "set6"
4) "set2"
5) "set3"
6) "set4"
127.0.0.1:6379>

总结

  1. 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
  2. 利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。

Hash哈希类型

我们可以将Redis中的Hash类型看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。

HSET/HGET/HEXISTS/HLEN/HDEL

  1. HSET key field val添加元素
  2. HGET key field 获取元素
127.0.0.1:6379> hset myhset id 1 name a
(integer) 0
127.0.0.1:6379> hget myhset id
"1"
127.0.0.1:6379> hget myhset name
"a"
127.0.0.1:6379>
  1. HEXISTS key field 判断值是否存在
  2. HLEN key获取字段长度
127.0.0.1:6379> hexists myhset id
(integer) 1
127.0.0.1:6379> hlen myhset
(integer) 2
127.0.0.1:6379>
  1. HDEL key field [field ...] 删除元素
127.0.0.1:6379> hdel myhset id
(integer) 1
127.0.0.1:6379> hlen myhset
(integer) 1
127.0.0.1:6379>

HSETNX/HGETALL/HKEYS/HVALS/HMGET

  1. HSETNX key field value 等同于SETNX
  2. HGETALL key 获取指定key中所有的值
  3. HKEYS key 只获取字段名
  4. HVALS key 只获取字段值
  5. HMGET KEY/HMSET KEY
127.0.0.1:6379> hsetnx myhset id 1
(integer) 1
127.0.0.1:6379> hgetall myhset
1) "name"
2) "a"
3) "id"
4) "1"
127.0.0.1:6379> hkeys myhset
1) "name"
2) "id"
127.0.0.1:6379> hvals myhset
1) "a"
2) "1"
127.0.0.1:6379> hmget myhset id name
1) "1"
2) "a"
127.0.0.1:6379> hmset myhset id 2 name b
OK
127.0.0.1:6379> hkeys myhset
1) "name"
2) "id"
127.0.0.1:6379> hgetall myhset
1) "name"
2) "b"
3) "id"
4) "2"
127.0.0.1:6379>

Zset有序集合类型

它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是ZSET中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序.

Zset中添加、删除或更新一个成员都是非常快速的操作;

zset的中的功能,使用SET都可以做到

ZAdd/Zcard/ZCOUNT/ZREM···

  1. zadd 添加zset有序集合的内容

ZADD key score member [score] [member]

127.0.0.1:6379> zadd zsetkey 101 setkeymember1 102 setkeymemeber2 103 setkeymember3
(integer) 3
127.0.0.1:6379>
  1. zcard 查看zset的大小尺寸
  2. zcount 查看指定范围内的数量
  3. zrem 移除zset的member内容
  4. zrange 查看范围内容
  5. ZSCORE key member 获得分数
  6. zrank 获得排名
127.0.0.1:6379> zcard zsetkey
(integer) 3
127.0.0.1:6379> zcount zsetkey 101 102
(integer) 2
127.0.0.1:6379> zadd zsetkey 1000 setkeymember1000
(integer) 1
127.0.0.1:6379> zcard zsetkey
(integer) 4
127.0.0.1:6379> zadd zsetkey 2001 set2000
(integer) 1
127.0.0.1:6379> zcount zsetkey 50 500
(integer) 3
127.0.0.1:6379> zrem zsetkey setkeymember1000
(integer) 1
127.0.0.1:6379> zrange zsetkey 0 -1
1) "setkeymember1"
2) "setkeymemeber2"
3) "setkeymember3"
4) "set2000"
127.0.0.1:6379> zscore zsetkey set2000
"2001"
127.0.0.1:6379> zrank zsetkey set2000
(integer) 3
127.0.0.1:6379>

博客学习内容

redis学习(六)——Sorted Set数据类型 - 平凡希 - 博客园

1. ZADD/ZCARD/ZCOUNT/ZREM/ZINCRBY/ZSCORE/ZRANGE/ZRANK:#在Shell的命令行下启动Redis客户端工具。/> redis-cli#添加一个分数为1的成员。redis 127.0.0.1:6379> zadd myzset 1 "one"(integer) 1#添加两个分数分别是2和3的两个成员。redis 127.0.0.1:6379> zadd myzset 2 "two" 3 "three"(integer) 2#0表示第一个成员,-1表示最后一个成员。WITHSCORES选项表示返回的结果中包含每个成员及其分数,否则只返回成员。redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES1) "one"2) "1"3) "two"4) "2"5) "three"6) "3"#获取成员one在Sorted-Set中的位置索引值。0表示第一个位置。redis 127.0.0.1:6379> zrank myzset one(integer) 0#成员four并不存在,因此返回nil。redis 127.0.0.1:6379> zrank myzset four(nil)#获取myzset键中成员的数量。    redis 127.0.0.1:6379> zcard myzset(integer) 3#返回与myzset关联的Sorted-Set中,分数满足表达式1 <= score <= 2的成员的数量。redis 127.0.0.1:6379> zcount myzset 1 2(integer) 2#删除成员one和two,返回实际删除成员的数量。redis 127.0.0.1:6379> zrem myzset one two(integer) 2#查看是否删除成功。redis 127.0.0.1:6379> zcard myzset(integer) 1#获取成员three的分数。返回值是字符串形式。redis 127.0.0.1:6379> zscore myzset three"3"#由于成员two已经被删除,所以该命令返回nil。redis 127.0.0.1:6379> zscore myzset two(nil)#将成员one的分数增加2,并返回该成员更新后的分数。redis 127.0.0.1:6379> zincrby myzset 2 one"2"#将成员one的分数增加-1,并返回该成员更新后的分数。redis 127.0.0.1:6379> zincrby myzset -1 one"1"#查看在更新了成员的分数后是否正确。redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES1) "one"2) "1"3) "three"4) "3"2. ZRANGEBYSCORE/ZREMRANGEBYRANK/ZREMRANGEBYSCOREredis 127.0.0.1:6379> del myzset(integer) 1redis 127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four(integer) 4#获取分数满足表达式1 <= score <= 2的成员。redis 127.0.0.1:6379> zrangebyscore myzset 1 21) "one"2) "two"#获取分数满足表达式1 < score <= 2的成员。redis 127.0.0.1:6379> zrangebyscore myzset (1 21) "two"#-inf表示第一个成员,+inf表示最后一个成员,limit后面的参数用于限制返回成员的自己,#2表示从位置索引(0-based)等于2的成员开始,取后面3个成员。redis 127.0.0.1:6379> zrangebyscore myzset -inf +inf limit 2 31) "three"2) "four"#删除分数满足表达式1 <= score <= 2的成员,并返回实际删除的数量。redis 127.0.0.1:6379> zremrangebyscore myzset 1 2(integer) 2#看出一下上面的删除是否成功。redis 127.0.0.1:6379> zrange myzset 0 -11) "three"2) "four"#删除位置索引满足表达式0 <= rank <= 1的成员。redis 127.0.0.1:6379> zremrangebyrank myzset 0 1(integer) 2#查看上一条命令是否删除成功。redis 127.0.0.1:6379> zcard myzset(integer) 03. ZREVRANGE/ZREVRANGEBYSCORE/ZREVRANK:#为后面的示例准备测试数据。redis 127.0.0.1:6379> del myzset(integer) 0redis 127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four(integer) 4#以位置索引从高到低的方式获取并返回此区间内的成员。redis 127.0.0.1:6379> zrevrange myzset 0 -1 WITHSCORES1) "four"2) "4"3) "three"4) "3"5) "two"6) "2"7) "one"8) "1"#由于是从高到低的排序,所以位置等于0的是four,1是three,并以此类推。redis 127.0.0.1:6379> zrevrange myzset 1 31) "three"2) "two"3) "one"#由于是从高到低的排序,所以one的位置是3。redis 127.0.0.1:6379> zrevrank myzset one(integer) 3#由于是从高到低的排序,所以four的位置是0。redis 127.0.0.1:6379> zrevrank myzset four(integer) 0#获取分数满足表达式3 >= score >= 0的成员,并以相反的顺序输出,即从高到底的顺序。redis 127.0.0.1:6379> zrevrangebyscore myzset 3 01) "three"2) "two"3) "one"#该命令支持limit选项,其含义等同于zrangebyscore中的该选项,只是在计算位置时按照相反的顺序计算和获取。redis 127.0.0.1:6379> zrevrangebyscore myzset 4 0 limit 1 21) "three"2) "two"

学好基础,打好数据结构的基础,比什么都强!

http://www.dtcms.com/a/582264.html

相关文章:

  • Rust内存问题检测
  • 娄底市网站建设课程资源网站开发
  • 写 CSDN 文章的体会
  • Vibe Coding - 免费使用claude code 、gpt-5、grok-code-fast-1进行氛围编程
  • 【NOI】C++一维数组之数组计数法
  • flash xml网站wordpress 表单数据
  • 事业单位建立网站wordpress后台慢
  • 轴控功能块常用调用方法
  • 常用的电气元件详细介绍-11.7(1.5hour)
  • 【ZeroRange WebRTC 】STUN 在 WebRTC 中的角色与工作原理(深入指南)
  • 网站备案后需要年检吗系统更新
  • 怎么做收费网站宣传片制作公司排行
  • [Linux]学习笔记系列 -- [kernel]completion
  • 如何创建一个自己的Docker镜像(Dockerfile)
  • 从一个问题深入解析C++字符串处理中的栈损坏
  • 成都市做网站的公司建设网站的心得
  • 爱下手机站建设学院实验网站的作用
  • afsim-2.9.0升级Qt5.15.2
  • 网站域名实名认证通知最新国际军事新闻
  • 潍坊 营销型网站建设企业网站推广最有效的方法
  • 泰坦科技网站建设wordpress权限说明
  • [AI]关系论
  • 直通车推广计划方案seo关于网站搜索排名关键词的标准评定
  • 网络协议之传统DNS存在的问题以及httpdns
  • Linux——9
  • 广西网站建设证件查询安装wordpress到服务器
  • 电子电气架构 --- 高阶智能辅助驾驶浅析
  • GPT-4o与GPT-5存在七项零点击攻击漏洞
  • 医院信息化建设会议安排网站县级网站
  • 网站建设方案文库wordpress的标签页