Redis常用的数据类型
admin
2024-05-16 05:40:26
0

概述

Redis是一个开源的key-value存储系统,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型),为了保证效率,数据都是缓存在内存中。Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis是单线程+多路IO复用技术。

多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。

安装

https://blog.csdn.net/zhiwenganyong/article/details/125569173?spm=1001.2014.3001.5502

Redis启动

后台启动

  1. 拷贝一份redis.conf到其它目录

  1. 修改etc目录下的redis.conff(247行)文件将里面的daemonize no 改成 daemonize yes,让服务在后台启动

  1. 切换到/usr/local/bin,使用启动命令redis-server /etc/redis.conf

  1. 查看关于redis线程状态

ps -ef|grep redis

前台启动

使用命令redis-server

redis-server

客户端访问redis

redis-cli
ping #使用ping查看链接状态
shutdown #关闭redis,使用命令shutdown
多实例关闭,指定端口关闭:redis-cli -p 6379 shutdown
也可以通过杀进程关闭kill -9 进程号

常用的数据类型

键(key)操作

keys * #查看当前库所有key
exists key #判断某个key是否存在,例如 exists k1 (k1是否存在)
type key #查看你的key是什么类型,例如 type k1 (查看k1的类型)
del key #删除指定的key数据,例如 del k1 (删除k1的数据)
unlink key #根据value选择非阻塞删除,仅将keys从keyspace元数据中删除,(真正的删除会在后续异步操作根据value选择非阻塞删除 )
expire key 10 #10秒钟,为给定的key设置过期时间
ttl key #查看还有多少秒过期,-1表示永不过期,-2表示已过期
select #命令切换数据库,如: select 1
dbsize #查看当前数据库的key的数量
flushdb #清空当前库
flushall #通杀全部库

字符串String

String是Redis最基本的类型,一个key对应一个value。String类型是二进制安全的。意味着Redis的string可以包含任何数据(比如jpg图片或者序列化的对象)。String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

String的相关命令

set   #添加键值对
get  #查看对应键值
append   #追加到原值的末尾
strlen  #获得值的长度
setnx   #只有 key 不存在时,才加入该 key 的值
incr  #将 key 中储存的数字值增 1,只能对数字值操作,如果为空,新增值为 1
decr  #将 key 中储存的数字值减 1,只能对数字值操作,如果为空,新增值为 -1
incrby / decrby  <步长> #将 key 中储存的数字值增减。自定义步长
mset     ...... #设置一个或者多个 key-value 键值对
mget   ...... #获取一个或者多个 key-value 键值对
msetnx     ...... #同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在,如果有一个存在,就不会成功
getrange  <起始位置> <结束位置> #获得值的范围,前包,后包,类似 java 中的 substring
setrange  <位置>  #设置指定区间范围内的值,用 覆写所储存的字符串值,从<起始位置>开始(索引从0开始)
setex  <过期时间/秒>  #设置键值的同时,设置过期时间,单位秒
psetex  <过时间/毫秒>  #设置键值的同时,设置过期时间,单位毫秒
getset   #以新换旧,设置了新值同时获得旧值
自增自减操作具有原子性,所谓原子操作是指不会被线程调度机制打断的操作;
这种操作一旦开始,就一直运行到结束,中间不会有任何 (切换到另一个线程)。
存储对象可以存储json数据。

列表List

Redis 列表List是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),特点是单键多值,底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

List相关命令

lpush/rpush     ... #从左边 / 右边插入一个或多个值,左右也就是首尾
lrange    #按照索引下标获得元素(从左到右,先进后出)
lrange  0 -1 #如果 start 是 0,stop 是 -1,代表获取所有元素
lpop/rpop  #从左边 / 右边吐出一个值。吐出后该值就不存在 key 中
lindex   #按照索引下标获得元素(从左到右)(-1 代表最后一个,0 代表是第一个)
llen  #获得列表长度
linsert  before/after   #在元素某个值的前面 / 后面插入新值,如果 value 有多个,则插入最前面的那个
lrem    #从左边删除 n 个 value(从左到右),如果有多个一样的 lement,则删除列表最前面的的
lset    #将列表 key 下标为 index 的值替换成 value
List的数据结构为快速链表quickList。首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。
当数据量比较多的时候才会改成quicklist。

集合Set

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。

Set相关命令

sadd    ... #将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
smembers  #取出该集合的所有值
sismember   #判断集合是否为含有该值,有 1,没有 0
scard  #返回该集合的元素个数
srem    ... #删除集合中的某个元素
spop  #随机从该集合中吐出一个值,key 里就没有该值了
srandmember   #随机从该集合中取出 n 个值。不会从集合中删除
smove    #把集合中一个值从一个集合移动到另一个集合,其中 key1 为要获取的集合,key2 为放入的集合
sinter   #返回两个集合的交集元素
sunion   #返回两个集合的并集元素
sdiff   #返回两个集合的差集元素(key1 中的,不包含 key2 中的)

哈希Hash

Redis hash 是一个键值对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象,类似Java里面的Map

hash相关命令

hset      ... #给集合 key 的 filed 键赋值 value,批量也可以,4.0 之前是 hmset,现在 hset 也可以批量添加
hget   #从 key 集合取出 value
hexists   #查看哈希表 key 中,给定域 field 是否存在
hkeys  #列出该 hash 集合的所有 field
hvals  #列出该 hash 集合的所有 value
hincrby    #为哈希表 key 中的域 field 的值加上增量
hsetnx    #将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在
Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable

有序集合Zset

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

zset相关命令

zadd      ... #将一个或多个 member 元素及其 score 值加入到有序集 key 当中
zrange    [withscores] #返回有序集 key 中,下标在 star t和 stop 之间的元素
zrevrange    [withscores] #同上,改为从大到小排列
zrangebyscore    [withscores] [limit offset count] #返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。 有序集成员按 score 值递增(从小到大)次序排列
zrevrangebyscore    [withscores] [limit offset count] #同上,改为从大到小排列
zincrby    #为元素的 score 加上增量
zrem   #删除该集合下,指定值的元素
zcount    #统计该集合,分数区间内的元素个数
zrank   #返回该值在集合中的排名,从 0 开始
zrevrank   #返回有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序

zset底层使用了两个数据结构

  • hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。

  • 跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

跳跃表(跳表)

有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单。

相关内容

热门资讯

高端社交软件推荐 安全可靠的富... 在当今数字化社交日益普及的背景下,高质量的社交平台正成为高净值人群拓展人脉、建立深度连接的重要渠道。...
初中英语同步课文跟读APP推荐... 许多初中生放学后希望借助英语课本进行口语练习,但家中缺乏专业发音指导,家长的英语发音可能不够标准,难...
定向流量支持哪些APP应用|主... 不少用户在办理定向流量套餐后,常会疑惑:哪些应用能真正享受免流服务?尤其在刷视频、听音乐、看资讯时,...
免费动漫软件推荐app有哪些 ... 不少动漫爱好者在寻找优质观番平台时,常常面临付费门槛高、广告干扰多、资源更新慢等问题。为此,我们整理...
免费交友软件推荐|安全靠谱的聊... 如今,社交方式正经历深刻变革,线上交友已成主流趋势。许多年轻人希望找到无需付费、操作便捷的社交平台,...
图片变清晰的软件推荐|免费高清... 图片清晰度直接影响视觉传达效果,当原图存在模糊、噪点或细节缺失等问题时,专业图像增强工具能有效提升画...
家园梦想派对角色介绍一览 家园... 对于想要在家园梦想派对游戏里面找到自己适合使用的新手角色这类玩家而言,大家在选择重要角色的时候,一定...
崩坏因缘精灵UP角色选择一览 ... 在崩坏因缘精灵里面其实大家如果要选因缘师角色的话,以下的这些都是功能符合阵容也比较多的,崩坏因缘精灵...
崩坏因缘精灵刺客阵容怎么玩 崩... 崩坏因缘精灵里面对于玩家想要了解的刺客阵容,因为其中的刺客角色并不算很多,所以在结合了其他不同种类的...
《我的世界》圣龙生存玩法解说视... 第1页:第一期展开《我的世界》圣龙生存大家玩过吗?非常好玩的一个地图,需要探索的方面非常多,今天就为...