欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > redis学习笔记——redis中的常见数据类型以及相关命令

redis学习笔记——redis中的常见数据类型以及相关命令

2024/10/24 16:32:13 来源:https://blog.csdn.net/qq_73924465/article/details/141337813  浏览:    关键词:redis学习笔记——redis中的常见数据类型以及相关命令

一.Redis的基础知识

  • redis中默认有16个数据库,我们一般默认使用0号数据库,但是我们可以使用select命令进行切换,比如说我们现在切换到1号数据库:

    SELECT 1;
    

    同时我们还可以查看当前数据库的大小:

    DBSIZE
    
  • 在开始对redis的详细讲解之前,我们先来看几个redis的常用命令:

    key *  # 查看所有的key
    flushdb #清空当前数据库
    flushall #清空全部数据库
    exists key #判断值是否存在
    move name 1 #移动key为name到1号数据库
    expire name 10 #设置key为name的值10s后过期
    ttl name #查看当前key剩余秒数
    
  • redis是单线程/多线程?

    redisredis5以及之前的版本都是单线程的,这导致它只有一个worker队列,这导致了所有的读写操作都要在这个队列里面完成,这虽然保证了线程安全,但是读写 write、read 这些系统调用在Redis执行期间占用了大部分的 CPU 时间,所以在redis6中引入了多线程,进化成了多线程+单线程模式,它保留了只有一个worker任务队列,但是引入了多个IO子线程来减低worker的读写压力,利用这种单线程+多线程共同运作的机制,将CPU的性能显著提升了。

    为什么redis要保留单线程的结构?

    • 这种机制不会产生线程安全问题,因为Redis在针对数据的内存操作时,是在一个公共的worker队列中实现的,先进先出,所以不会有线程安全问题。

二.Redis的数据类型

2.1 前言

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。

2.2 Redis的基础数据类型以及它的常用命令

2.2.1 Redis-Key

key *  # 查看所有的key
flushdb #清空当前数据库
flushall #清空全部数据库
exists key #判断值是否存在
move name 1 #移动key为name到1号数据库
expire name 10 #设置key为name的值10s后过期
ttl name #查看当前key剩余秒数
type name # 查看查看当前key为name的值类型
append key1 "hello" #追加键值对
strlen key1 # 查看key为key1的长度

2.2.2 String

# 设置值
set key1 a
#在原先值上追加(key不存在是做set处理)
append key b  # 追加后的结果为ab
# 获取key的长度
strlen keyincr views # 自加1
decr views # 自减1incrby views 10 # 自加10,步长为10
decrby views 10 # 自减10,步长为10# 替换指定位置的字符串
setrange key1 3 "hello"# 设置过期时间
setex key 10 "hello"
setnx key 10 "hello"(不存在再设置)#批量处理
mset k1 v1 k2 v2 k3 v3 (#批量设置值)
mget k1 v1 k2 v2 k3 v3 (#批量获取值)msetnx k1 v1 k4 v4  #当不存在时批量设置值 msetnx是一个原子性的操作,要么一起成功,要么一起失败# 对象
set user:1 {name:zhangsan,age:3}# 批量设置对象
mset user:1:name lisi user:2 name:aaa
mget user:2:name user:1agegetset key1 redis #先获取,再设置,如果不存在返回nil,设置新值,如果存在,替换原来的值

备注::string的value既可以是字符串也可以是数字,一般可以用来做计数器和统计多单位的数量

2.2.3 list

list列表是按照顺序(先进先出)排序的字符串列表,接受在列表的头部(左边)或尾部(右边)添加元素,基于redis列表我们可以实现栈,队列和阻塞队列,它的命令一共有三种,这里我们根据它开头字母不同分为以下三种:

  • L类
  • R类
  • B类
# L类
LINDEX 列表 索引 #通过索引获取列表中的元素
LINSERT 列表 BEFORE/AFTER 参考值 element#把 element 插入到列表 key 中参考值的前面或后面。
LLEN 列表 #获取列表长度
LPOP 列表 #移除并且获取列表的第一个值
LPUSH 列表 key[key...] #将一个或多个key插入到列表头部
LPUSHX 列表 key[key...] #在当 key 存在并且存储着一个 list 类型值的时候,向值 list 的头部插入 value。 与 LPUSH 相反,当 key 不存在的时候不会进行任何操作
LRANGE 列表 start stop #用于返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素
LREM 列表 count element #用于从列表 key 中删除前 count 个值等于 element 的元素。
#拓展:
#count > 0: 从头到尾删除值为 value 的元素。
#count < 0: 从尾到头删除值为 value 的元素。
#count = 0: 移除所有值为 value 的元素。
LSET 列表 index element #设置列表 key 中 index 位置的元素值为 element index 超出列表索引范围时会返回错误ERR ERR index out of range
LTRIM key start stop #用于修剪(trim)一个已存在的 list,这样 list 就会只包含指定范围的指定元素。start 和 stop 都是由0开始计数的。
#示例:LTRIM foobar 0 2 将会对存储在 foobar 的列表进行修剪,只保留列表里的前3个元素# R类
RPOR 列表 #移除并获取列表的最后一个元素
RPOPLPUSH 列表1 列表2 #移除列表的最后一个元素,并将该元素添加到另一个列表并返回
RPUSH 列表 key[key...] #将一个或多个key插入到列表尾部
RPUSHX 列表 key[key...] #在当 key 存在并且存储着一个 list 类型值的时候,向值 list 的尾部插入 value。 与 LPUSH 相反,当 key 不存在的时候不会进行任何操作# B类
BLPOP 列表[列表...] timeout #移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。它是 LPOP 的阻塞版本。
BRPOP 列表[列表...] timeout #移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。它是 RPOP 的阻塞版本。
BRPOPLPUSH 列表1 列表2 timeout #从列表中取出最后一个元素,并插入到另外一个列表的头部; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。它是RPOPLPUSH的阻塞版本。

2.2.4 hash

Hash(哈希散列)是 Redis 基本数据类型,值value 中存储的是 hash 表。Hash 特别适合用于存储对象,常用命令也很简单:

HDEL hash(你定义的哈希散列) filed[filed...] #删除哈希散列中一个或多个字段
HEXISTS hash filed #用于判断哈希表中字段是否存在
HGET hash filed #获取存储在哈希表中指定字段的值
HGETALL hash #获取在哈希表中的所有字段和值
HINCRBY hash filed increment #为hash中的域field的值加上增量increment
HKEYS hash #获取存储在hash中的所有字段
HLEN hash #获取存储在hash中的哈希表的字段数量
HSET hash filed value #为存储在hash中的哈希表的field字段赋值value
HVALUES hash #用于获取哈希表中的所有值

2.2.5 set

Redis 的 Set 是 string 类型的无序集合。集合成员是唯一的,这就意味着集合中没有重复的数据。在 Redis 中,添加、删除和查找的时间复杂都是 O(1)(不管 Set 中包含多少元素)。下面是它的常用命令:

SADD set member[member...] #命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略
SCARD set # 返回集合中元素的数量
SDIFF SER[SET...] #返回集合与其他集合之间的差异
SETDIFFSTORE destination set[set...] #作用和SDIFF类似,不同的是它将结果保存到 destination 集合,而把结果集返回给客户端。
SINSERT set[set...] #返回所有给定集合的成员交集
SETDIFFSTORE destination set[set...] #作用和SINSERT类似,不同的是它将结果保存到 destination 集合,而把结果集返回给客户端。
SISMEMBERS set member#用于判断元素 member 是否集合 set 的成员
SMEMBERS set #返回集合中的所有成员
SMOVE source destination membe r#用于从集合source 中移动成员member 到集合 destination。 这个操作是原子操作
SPOP set [count] #从集合 key中删除并返回一个或多个随机元素
SRANDMEMBER set [count] #那么随机返回集合key 中的一个随机元素
#备注:Redis 2.6开始,可以接受 count 参数,如果count是整数且小于元素的个数,返回含有 count 个不同的元素的数组,如果count是个整数且大于集合中元素的个数时,返回整个集合的所有元素,当count是负数,则会返回一个包含count的绝对值的个数元素的数组,如果count的绝对值大于元素的个数,则返回的结果集里会出现一个元素出现多次的情况.
#仅提供key参数时,该命令作用类似于SPOP命令,不同的是SPOP命令会将被选择的随机元素从集合中移除,而SRANDMEMBER 仅仅是返回该随记元素,而不对原集合做任何操作。SREM set member[member...] #用于在集合中删除指定的元素。如果指定的元素不是集合成员则被忽略
SUNION set[set...] #返回所有给定集合的并集
SUNIONSTORE destination set [set ...] #作用和SUNION类似,不同的是它将结果保存到 destination 集合,而把结果集返回给客户端
SSCAN set cursor(游标) [MATCH pattern(匹配规则)] [count] #用于遍历集合中键的元素
#参数声明:
#cursor - 游标。
#pattern - 匹配的模式。
#count - 指定从数据集里返回多少元素,默认值为 10 。#示例:
> SADD myset1 "Google"
(integer) 1
> SADD myset1 "Redis"
(integer) 1
> SADD myset1 "Taobao"
(integer) 1
> SSCAN myset1 0 match R*
1) "0"
2) 1) "Redis"

2.2.6 有序集合(Sorted Set)

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。Redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数 ( score ) 却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 232 – 1 ( 4294967295 ) , 每个集合可存储 40 多亿个成员,常用命令还是很简单的:

ZADD zset [NX|XX] [GT|LT] [CH] [INCR] score member [score member...] #用于将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
#参数说明:
# XX: 仅更新存在的成员,不添加新成员。
# NX: 不更新存在的成员。只添加新成员。
# LT: 更新新的分值比当前分值小的成员,不存在则新增。
# GT: 更新新的分值比当前分值大的成员,不存在则新增。
# CH: 返回变更成员的数量。变更的成员是指 新增成员 和 score值更新的成员,命令指明的和之前score值相同的成员不计在内。 注意: 在通常情况下,ZADD返回值只计算新添加成员的数量。
# INCR:将指定的分数加到现有的分数上,而不是设置一个绝对的分数(与 ZINCRBY 功能一样。一次只能操作一个score-element对)ZCARD zset #用于返回有序集的成员个数
ZCOUNT zset min max #返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量
ZINCRBY zset increment member #为有序集 key 的成员 member 的 score 值加上增量 increment ZUNIONSTORE destination numkeys zset [zset ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]#于计算给定的numkeys个有序集合的并集,并且把结果放到destination中。
#备注:
#给定要计算的key和其它参数之前,必须先给定key个数(numkeys)。默认情况下,结果集中某个成员的score值是所有给定集中该成员score值之和。#用WEIGHTS选项,你可以为每个给定的有序集指定一个乘法因子,意思就是,每个给定有序集的所有成员的score值在传递给聚合函数之前都要先乘以该因子。如果WEIGHTS没有给定,默认是 1。#用AGGREGATE选项,你可以指定并集的结果集的聚合方式。默认使用的参数SUM,可以将所有集合中某个成员的score值之和作为结果集中该成员的score值。如果使用参数MIN或者MAX,结果集就是所有集合中该元素最小或最大score。#如果destination存在,会被覆盖ZINTERSTORE destination numkeys  zset [zset ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]#计算 numkeys 个有序集合的交集,并且把结果放到 destination 中ZLEXCOUNT zset min max #当有序集中的所有成员都有相同的score,回有序集中值在 min 和max之间的成员个数。
#示例:
redis> ZADD myzset 0 a 0 b 0 c 0 d 0 e
(integer) 5
redis> ZADD myzset 0 f 0 g
(integer) 2
redis> ZLEXCOUNT myzset - +
(integer) 7
redis> ZLEXCOUNT myzset [b [f
(integer) 5ZRANGE zset start stop [WITHSCORES]#返回有序集中,指定区间内的成员,其中成员的按分数值递增(从小到大)来排序,具有相同分数值的成员按字典序(lexicographical order )来排列,倒序可以使用(ZREVRANGE),可以传递 WITHSCORES 选项,以便将元素的分数与元素一起返回。这样返回的列表将包含 value1,score1,...,valueN,scoreN ,而不是 value1,...,valueNZRANGEBYLEX zset max [LIMIT offset count] #从有序集合(sorted set)中按字典顺序获取成员的命令
#LIMIT offset count(可选):用于分页的选项,其中 offset 是起始位置,count 是返回的成员数量。ZRANGEBYSCORE zset min max [WITHSCORES] [LIMIT offset count] #返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员ZRANK zset member #返回有序集key中成员member的排名,其中有序集成员按score值从低到高排列,
ZREM zset member [member ...] #用于从有序集合key中删除指定的成员member
ZREMRANGEBYLEX zset min max #移除有序集合中给定的字典区间的所有成员
ZREMRANGEBYRANK zset min max #移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYSCORE zset min max #移除有序集合中给定的分数区间的所有成员
ZSCORE zset member #返回有序集中成员的分数值
ZSCAN key cursor [MATCH pattern] [COUNT count] #可以参考SCAN

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com