Redis系列(3)- cli常用命令-程序员宅基地

技术标签: java  # 分布式技术  数据库  redis  

在学习redis命令前,先了解一下以下redis的特性,

  • redis是非关系型数据库,它可以存储key和5种不同类型的值之间的映射;
  • redis的命令不区分大小写,但数据的key是区分大小写的,redis中的所有操作全是原子操作,它整个架构被实现成单线程;
  • redis的数据类型不支持数据类型嵌套,基本全是字符串,比如集合类型的元素不能是另一个集合或是散列表等;
  • 在redis中每个key都属于一个明确的数据类型,如通过hset建立的是散列类型,set建立的是字符串类型,如果使用一种数据类型的命令操作另一种数据类型的key会提示错误:”ERR Operation againset a key holding the wrong kind of value”;

以下所有操作可以在GUI工具或是redis-cli交互终端中执行,交互终端进入方式,需要先进入到/usr/local/Cellar/redis/6.2.6/bin目录下:

//本地连接
./redis-cli

//退出连接,可在交互窗口中直接输入exit
127.0.0.1:6379>exit

//远程连接,命令格式【./redis-cli -h IP -p PORT】 ,比如:
./redis-cli -h 127.0.0.1 -p 6379

节点操作

连接命令

  • quit:关闭连接(connection)
  • auth:简单密码认证
  • ping:回复为PONG正常
  • help cmd: 查看cmd帮助,例如:help quit
  • select index:选择数据库,从0开始,默认为16个数据库
  • info:它有大量的参数用于检查redis服务器的状态

持久化命令

  • save:将数据同步保存到磁盘RDB文件中,备份未完成前会阻塞客户端的请求
  • bgsave:将数据异步保存到磁盘RDB文件中,复制一个新进程来备份数据
  • lastsave:返回上次成功将数据保存到磁盘的Unix时戳
  • shundown:将数据同步保存到磁盘,然后关闭服务
  • bgrewriteaof:执行AOF重写
  • slowlog get:得到当前耗时命令日志内容,可通过配置来修改slowlgo策略,每条日志由日志ID,执行的LINUX时间,耗时单位(微秒),命令及参数4部分组成。

远程服务控制

  • info:提供服务器的信息和统计
  • monitor:实时转储收到的请求
  • slaveof ip port:把当前数据库变为某个数据库的从数据库
  • slaveof no one:把当前从数据库变为主数据库
  • config:在运行时配置Redis服务器

通用命令

过期时间

  • expire:设定一个key的活动时间(s),超出活动时间此key将丢弃,可用来做优惠活动、验证码等,返回1表示设置成功,0表示失败,当使用set或getset命令为key重新赋值时也会取消这个时间
  • ttl:获得一个key的活动时间,-1表示永久生存,-2表示key不存在
  • pexpire:作用同expire,区别在于它的值为一个时间点unix时间戳
  • pttl:查看还有多少ms过期
  • persist key:取消生存时间限制,用set或gestate命令重新赋值时也会取消生存时间限制,但incr, lpush, hset, zrem不会影响
  • expireat:作用同expire, 区别在于它的值为一个时间点unix时间戳
  • pexpireat:将一个ms级的unix时间戳设置为给定KEY的过期时间

对value操作的命令

  • exists(key):确认一个key是否存在,返回0或1
  • del(key):删除一或多个key,del命令不支持通配符,可以结合xargs命令自己实现,redis-cli keys “user:*” | xarges reds-cli del //删除所有以user:开头的键,这个命令需要在普通的命令提示符下运行,redid-cli del ‘redis-cli keys “user:*”’这条命令的性能更好
  • type(key):返回值的类型,string, list, hash, set, zset(有序集合)
  • keys(pattern):返回满足给定pattern的所有key,可选通配符?*[]\,此命令会遍历所有key,所以不建议在生产环境中使用
  • randomkey:随机返回key空间的一个
  • keyrename(oldname, newname):重命名key
  • dbsize:返回当前数据库中key的数目
  • select(index):按索引查询
  • move(key, dbindex):移动当前数据库中的key到dbindex数据库
  • flushdb:删除当前选择数据库中的所有key
  • flushall:删除所有数据库中的所有key
  • incr key:自增主键,key可以为一个变量,当set值其值为1,用incr时其值+1
  • incrby key count:指定键增加的数值
  • decr key:自减主键key的值减少1
  • decrby key count:key的值减少指定的count数量 
  • incrbyfloat key count:双精度浮点数自增

类型操作

String基础类型

在redis中String可以存储string, int, float三种数据类型。

  • set(key, value):给数据库中名称为key的string赋予值value,redis对键并没有要求,比较好的实践是用 资源名称:对象ID:对象属性 来命名一个键,比如user:1:friends来存储ID为1的用户的好友列表,但这种结构最好用hash来实现,否则不能保证其原子性,并不建议把整个数据序列化后存储为一个KEY中,这样会造成资源的浪费
  • strlen key:返回值的长度,一个汉字占3个字节,因为redis中接收的是UTF-8编码的中文
  • get(key):返回数据库中名称为key的string的value,当key不存在时返回nil
  • getset(key, value):给名称为key的string赋予上一次的value
  • mget(key1, key2,…, key N):返回库中多个string的value
  • setnx(key, value):添加string,名称为key,值为value
  • setex(key, time, value):向库中添加string,设定过期时间time
  • mset(key N, value N):批量设置多个string的值
  • msetnx(key N, value N):如果所有名称为key i的string都不存在
  • incr(key):名称为key的string增1操作,如果key不存在或值为空串当作0来处理
  • incrby(key, integer):名称为key的string增加integer
  • decr(key):名称为key的string减1操作
  • decrby(key, integer):名称为key的string减少integer
  • append(key, value):名称为key的string的值附加value,向已存在key的值后面追加一段字符串
  • getrange(key, start, end):返回名称为key的string的value的子串
  • getbit key index:二进制操作,一个字节由8个二进制组成,比如key值为bar由24个0和1组成,getbit  key 0,就取到的是0
  • setbit key index value:二进制操作,把此index的0或1用新值代替,比如stet key 7 1,则bar就变成了aar
  • bitcount key:获取二进制字符串中1的个数,加上参数则相当于长度限制,bit count key 0 1,统计前两个字节中1的个数
  • bigtop operation destkey key [key…]:多个值按operation进行二进制操作,值存储在desktop中,operation可选值有and, or, xor, not

List列表

可以存储一个有序的字符串列表。向列表两端加入元素,或者获得列表的某一个片段,也可以做为队列使用,分页等,链表上的每个节点都包含了一个字符串。

  • rpush(key, value):在名称为key的list尾添加一个值为value的元素
  • lpush(key, value):在名称为key的list头添加一个值为value的 元素
  • llen(key):返回名称为key的list的长度
  • lpop(key):返回并删除名称为key的list中的首元素
  • rpop(key):返回并删除名称为key的list中的尾元素
  • lindex(key, index):返回index位置的元素,它和下面的let中的Index同样支持大于小于0的操作
  • list(key index value):将索引为index的元素赋值为value
  • lset(key, index, value):给名称为key的list中index位置的元素赋值
  • lrange(key, start, end):返回名称为key的list中start至end之间的元素,从左开始数,查询操作。如果为负数,比如orange key -2 -1,表示取key的最后两个元素
  • ltrim(key, start, end):截取名称为key的list,和lrem正好是个相反的操作,配合push等可以保证某个表中只保留最新的多少条记录
  • lrem(key, count, value):删除count个值为value的元素并返回,当count>0时从左数,当<0时从右数,当=0时是整个列表(删除整个队列中值为value的元素)
  • insert key before|after pivot value:首先从左开始查找值为pivot的元素,然后根据第二个参数来决定将value插入到此元素的前还是后面
  • 下面4个命令是阻塞方式
  • blpop(key1, key2,… key N, timeout):lpop命令的block版本或在timeout秒内阻塞并等待可弹出的元素出现。
  • brpop(key1, key2,… key N, timeout):rpop的block版本或在timeout秒内阻塞并等待可弹出的元素出现。
  • rpoplpush(srckey, dstkey):将元素从一个列表转到另一个列表,返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
  • brpoplpush(srckey, dstkey, timeout):将元素从一个列表转到另一个列表,返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部,如果srckey为空,那么在timeout秒内阻塞并等待可弹出的元素出现

Set集合类型

无序集合,它的内部是使用值为空的hash来实现的,方便的地方可以做并、交、差集运算

  • sadd(key, member):向名称为key的set中添加元素member,返回添加的数量
  • srem(key, member):删除名称为key的set中的元素member
  • smembers(key) :返回名称为key的set的所有元素
  • spop(key) :随机返回并删除名称为key的set中一个元素
  • smove(srckey, dstkey, member) :移到集合元素,成功返回1,否则返回0
  • scard(key) :集合中的元素个数
  • sismember(key, member) :在key中是否存在member元素
  • sinter(key1, key2,…key N):求交集
  • sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
  • sunion(key1, (keys)) :求并集
  • sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
  • sdiff(key1, (keys)) :求差集,注意key的顺序不同结果也不同
  • sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
  • srandmember(key) num:随机返回set的num元素,当num大于集合的大小时全部返回,当>0时返回num个不重复的元素,当<0时有可能返回重复的num个元素

SortSet有集集合

它和sort的最大区别是不支持集合操作,另一方面和hash很类似,它为每个值提供了score。提供了字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定。所以一般应用是是将数据转换为整数并搭配这里的score功能。这样可以简化对特定元素的范围查找。比如IP查找城市功能,就是在set里记录IP起始值的IP,然后分段查找小于等于输入的值,再取这里最大的值或直接用zrangebyscore命令。

  • zadd key score member:添加一个元素和此F1关心人分数,如果分数存在则会替换,比如记录分数add scores 89 tom 67 peter 100 david,其中分数可以是Int也可以是float,+inf和-inf表示正负无穷
  • zscore key member:获得元素的分数
  • zrange key start stop [withscores]:从小到大查找范围分数内的元素,如果需要同时获得分数,可以在外面加上”withscores”,如果stop=-1,表示查询start和最后一个元素,一会返回两个元素
  • zrevrange key start top [withscores]:和上面不同的是它是从大到小查询的
  • zrangebyscore key min max [withscores] [limit offset count]:获得指定分数范围的元素,比如80 100,表示100>=score>=80,如果80 (100表示不包括100,同样支持+inf和-inf。limit同mysql的用法一样,从结果集offset开始的count个元素。
  • zincrby key increment member:增加某个元素的分数
  • zcard key:集合中的元素个数
  • zcount key min max:获得指定分数范围内的元素个数
  • zrem key member:删除一个或多个元素
  • zremrangebyrank key min max:按排名范围删除元素,其实就是按照索引顺序删除元素
  • zremrangebyscore key min max:按分数范围删除元素
  • zrank key member:从小到大获得元素的排名
  • zrevrank key member:从大到小获得元素的排名
  • zinterstore destination numkeys key [key…] [weights weight [weight…]] [aggregate sum|min|max]:计算集合的交集,并将结果存放在destination中。destination中元素的分数由aggregate来决定。zadd s1 1 a 2 b,zadd s2 10 a 20 b,则zinterstore snew 2 s1 s2> a 11 b 22, zinterstore snew 2 s1 s2 aggregate min> a 1 b 2, max时> a 10 b 20,weights表示不同集合的权重,需要相乘
  • zunionstore destination numkeys key [key…] [weights weight [weight…]] [aggregate sum|min|max]:计算集合的并集

Hash散列

一般用于存储二维数据,可以看作关系数据库中行或文档数据库中的文档。

  • hset(key, field, value):向名称为key的hash中添加元素field,它不区分插入和更新操作,当为插入时返回1,更新时返回0
  • hget(key, field):返回名称为key的hash中field对应的value
  • hmget(key, (fields)):返回名称为key的hash中field对应的value,hmget car price color
  • hmset(key, (fields)):向名称为key的hash中添加元素多个field,hmset car price 500 color red
  • hgetall key:返回key中的所有域的值
  • hincrby(key, field, integer):将名称为key的hash中field的value增加integer,是在原基础上,如果此key不存在则会默认创建
  • hincrbyfloat(key, field, integer):将名称为key的hash中field的value增加float
  • hexists(key, field):名称为key的hash中是否存在键为field的域
  • hsetnx key field value:当字段不存在时赋值,如果字段存在则不进行操作
  • hdel(key, field):删除一或多个名称为key的hash中键为field的域
  • hlen(key):返回名称为key的hash中元素个数
  • hkeys(key):返回名称为key的hash中所有键
  • hvals(key):返回名称为key的hash中所有键对应的value
  • hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

高级命令

发布与订阅

redis提供了5个与发布和订阅相关的命令,这东西也可以用于服务发现等功能。采用redis提供的5个简单命令可以实现简单的功能,但它本身存在以下问题:1、与redis的稳定性有关,如果一个client读取信息不够快的话,不断积压的消息会使内存越来越大。2、与redis的可靠性有关,如果中间断线,那么client将丢失在断线期间发送的所有消息。

  • subscribe(channel...channelN):订阅给定的一个或多个频道,一旦进入这种状态后只能使用subscribe/unsubscribe/psubscribe/punsubscribe这四个命令中的某一个
  • unsubscribe(channel...channelN):取消订阅给定的一个或多个频道,如果没有参数则退订所有的频道
  • publish(channel, message):向给定频道发送消息,返回值是接收此消息的订阅者的数量,这个消息是实时的,不会被缓存。如果没有收到此消息就丢失了
  • psubscribe(pattern...patternN):订阅与给定模式相匹配的所有频道
  • punsubscribe(pattern...patternN):取消订阅与给定模式相匹配的所有频道,如果没有参数则退订所有的频道

事务与锁

它是由一组命令组成的,由multi开始,以exec结束,并且建议同时使用watch和unwatch命令。这是一个阻塞操作,它会阻塞同一客户端发送过来的命令。后续发送的命令会被缓存起来。它的好处是减少连接次数。这三个命令构成了一个乐观锁。基本事务:需要用到multi和exec命令,可以让一个客户端在不被打断的情况下执行多个命令,多个命令会按序执行,redis会把多个命令加入到一个队列里,直到客户端发送exec为止。注意这种实现最好是把命令打包发送,减少交互的过程时间。但在java里好像没有类似的类库。

  • multi:开启一个事务
  • exec:提交事务,会取消对所有key的watch,一般来说事务执行失败后需要重试
  • watch key:监视即将执行事务中的key是否发生变化,如果发生了写的变化,事务将执行失败,因为事务是先缓存命令,一起提交的,此命令可以在multi前也可以在后面但必须在exec前面,这个命令可以看成一个乐观锁,如果失改了自己重试即可;
  • unwatch key:取消对某个值的监控
  • discard:撤消watch命令并清空所有已入队命令
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liudonglovehemin/article/details/130517675

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法