redis常规命令记录

 

概述

因为redis是单线程执行,所以不用关心并发问题。

简单记录一下redis的操作命令,留作查阅,回头再整理一下事物等操作。

reids中存储的是kev-value形式, 其中的value有几种:

  1. 字符串: 就是简单的string

  2. 字符串列表: 有序可重的列表

  3. 字符串集合: 无序去重的

  4. 字符串有序集合: 有序去重的

  5. 哈希: 存储一张哈希表

  6. HyperLogLog: 基数操作,即获取去重集合中的元素个数

各类型存储命令介绍

字符串

简单的字符串存储了

字符串操作

新建

  • set key value: 设置value

  • setex key 2 value: 设置value,并设置过期时间为2s

  • psetex key 2000 value: 设置value,并设置过期时间为2000ms

  • setnx key value: 设置value,当key存在时不设置

  • append key value: 若key存在,将将value拼到原值后边,否则直接设置

更新

  • getset key value: 设置value并返回旧的value

  • setrange key 2 value: 更新,将value拼到原值偏移量2的后边

查询

  • get key: 获取value

  • getrange key 2 3: 获取value的2-3的字串, 下标从0开始, 负数表示从后往前

  • strlen key: 获取字符串长度

字符串批量操作

  • mset key1 value1 [key2 value2 ...]: 批量设置

  • msetnx key1 value1 [key2 value2 ...]: 批量设置,当key存在时不覆盖

  • mget key1 [key2 ...]: 批量获取

字符串位操作

比如设置一篇文章的是否阅读, 可以将用户的id作为偏移量, 1表示阅读过, 0表示没有阅读

  • getbit key offset: 返回偏移量上的值,0或1

  • setbit key offset 1: 设置偏移量上的值

计数操作

简单理解就是存个数字,因为redis是单线程,所以也可以用它来防并发

  • incr key: +1,不存在时为0+1

  • incrby key 2: +2

  • incrbyfloat key 2.4: +2.4

  • decr key: -1

  • decrby key 2.4: -2.4

列表

列表是一个有序可重复的集合,可以参考java中的 List

插入

  • linsert key before(after) value1 value: 在value1的前边(后边)插入value,若成功,返回列表的新长度,若失败返回-1,若列表为空,返回0

  • lpush key value1 [value2 ...]: 将值插入到列表头部

  • rpush key value1 [value2 ...]: 将值插入到列表尾部

  • lpushx key value: 将值插入列表的头部,若列表不存在,操作无效

  • rpushx key value: 将值插入列表的尾部,若列表不存在,操作无效

  • lset key 2 value: 设置列表下标为2的值

删除

  • lrem key count value: 删除列表中的value

    • count:删除的个数,整数从前往后,负数从后往前,0删除所有

  • ltrim key 2 3: 列表只保留2-3的元素,删除其余元素

查询

  • blpop key1 [key2 ...] timeout: 获取并移除列表的第一个元素,阻塞timeout秒,若没有拿到,返回nil

  • brpop key1 [key2 ...] timeout: 获取并移除列表的最后一个元素,阻塞

  • brpoplpush key1 key2 timeout: 从key1中弹出(删除)最后一个值插入到key2中,若timeout秒没有拿到,返回nil

  • lpop key: 弹出列表的第一个元素

  • rpop key: 弹出列表的最后一个元素

  • rpoplpush key1 key2: 从key1中弹出最后一个元素插入到key2中

  • lindex key 2: 获取列表下标为2的元素

  • llen key: 获取列表长度

  • lrange key 2 3: 获取列表2-3的元素,负数从后往前

集合

集合是一个无序去重的,可参考java中的HashSet

更新

  • sadd key value1 [value2 ...]: 插入元素

  • smove key1 key2 value: 将value从key1移到key2,若key1中value不存在,则不执行操作

  • srem key value1 [value2 ...]: 将元素从集合中删除

查询

多个集合操作

  • sdiff key1 [key2 ...]: 返回所有集合的差集(值在key1中,不在其他集合中0)

  • sdiffstore newKey key1[key2 ...]: 返回所有集合的差集,将结果存储到newKey中

  • sinter key1 [key2 ...]: 返回所有集合的交集(值再每一个集合中都存在)

  • sinterstore newKey key1 [key2 ...]: 返回所有集合的交集,将结果存储到newKey中

  • sunion key1 [key2 ...]: 返回所有集合的并集

  • sunionstrore newKey key1 [key2 ...]: 返回所有集合的并集,将结果存储到newKey中

获取元素

  • spop key [count]: 从集合中随机弹出一个元素, 若指定count,则弹出count个元素

  • srandmember key [count]: 从集合中随机获取一个元素,若指定count,则获取count个元素,与 spop 不同,此命令不会删除元素

  • scard key: 获取集合元素数

  • sismember key value: 查看value是否在集合中

  • smembers key: 获取集合所有元素

  • sscan key cursor [match h*] [count count]: 迭代集合中的元素

    • cursor:游标,使用命令返回的新游标作为下一次迭代的游标,当返回为0时,迭代完成

    • count:指定返回的元素数量,默认为10,每次迭代获取的数量可以不相同

    • match:对返回的元素进行筛选,因为是在返回结果后进行筛选,所以可能返回空

有序集合

有序集合是去重有序,可参考java中的LindedHashSet

redis中的有序集合通过给每个元素设置一个关联的分数,通过分数进行排序,当分数相同时,通过自然排序,即abcd

更新

  • zadd key score1 value1 [score2 value2 ...]: 添加元素,若存在更新分数

  • zincrby key 2.3 value: value的分数+2.3,若value不存在等同于add

删除

  • zrem key value1 [value2 ...]: 删除集合中的元素

  • zremrangebylex key min max: 删除集合中指定范围的元素,(min max 参考 zlexcount)

  • zremrangebyrank key 2 3: 删除集合排名2-3的元素

  • zremrangebyscore key min max: 删除集合中指定范围分数的元素,(min max 参考 zlexcount)

 

查询

获取个数

  • zcard key: 获取集合大小

  • zcount key 2 3: 获取集合中分数在2-3的元素数量

  • zlexcount key min max: 获取集合中成员在min-max之间的成员数量

    • min:-(负无穷), [a(最小值为a元素,闭区间), (a(开区间)

    • max: +(正无穷), [a, (a 同上

多个集合操作

  • zinterstore newKey num key1 [key2 ...]: 计算多个集合的交集,将结果存储到newKey中,结果集元素的分数为各集合元素分数和,num指定后边跟了几个集合

  • zunionstore newKey num key1 [key2 ...]: 计算多个集合的并集,将结果存储到newKey中,结果集元素的分数为各集合元素分数和,num指定后边跟了几个集合

获取范围元素

  • zrange key 2 3 [withscores]: 获取集合中排序为2-3的元素,负数从后往前,按分数从小到大排序

    • withscores:返回分数值

  • zrevrange key 2 3 [withscores]: 类似 zrange, 分数从大到小排序

  • zrangebylex key min max [limit offset count]: 返回集合中指定范围的元素,(min max 参考 zlexcount)

    • limit offset count: 可参考sql

  • zrangebyscore key min max: 返回集合中指定分数范围的元素,(min max 参考 zlexcount)

  • zrevrangebyscore key max min [withscores]: 类似 zrangebyscore, 分数从大到小

获取元素信息

  • zrank key value: 返回value的排名

  • zrevrank key value: 返回value的排名,分数从大到小

  • zscore key value: 返回value的分数

  • zscan key cursor [match h*] [count count]: 迭代集合,参数参考 sscan

哈希

存储一张哈希表,简单说就是多个kay-value对,可以用来存储对象属性等

更新

  • hmset key field1 value1 [field2 value2 ...]: 批量设置键值对

  • hset key field value: 设置键值对

  • hsetnx key field value: 设置键值对,若已存在则不设置

  • hincrby key field 2: 给字段+2

  • hincrbyfloat key field 2.4: 给字段+2.4

删除

  • hdel key field1 [field2 ...]: 删除哈希表的字段

查询

  • hlen key: 获取字段数量

  • hexists key field: 查看哈希表中field字段是否存在

  • hget key field: 获取哈希表中字段的值

  • hkeys key: 获取所有字段

  • hvals key: 获取所有值

  • hgetall key: 获取哈希表的所有字段和值

  • hmget key field1 [field2 ...]: 获取所有给定字段的值

  • hscan key cursor [match h*] [count count]: 迭代,参数参考 sscan

HyperLogLog

HyperLogLog(什么鬼名字)是用来做基数统计的,也就是统计一个去重的集合中元素的个数,那直接使用集合不就好了?

使用集合的话,每个元素都进行存储,若需要做大量统计,则十分耗费内存,HyperLogLog并不直接存储元素,不管有多少元素(2^64)都只需要12KB内存空间,也正因如此,并不能通过这个结构直接返回元素,只能计算其中元素的个数,但只是估算,可以理解。

  • pfadd key value1 [value2 ...]: 将元素添加

  • pfcount key1 [key2 ...]: 返回基数估算值,若多个则返回估算值得和

  • pfmerge newKey key1 [key2 ...]: 将多个合并为一个,存到newKey中

通用命令

更新

  • del key: 删除键

  • expire key 2: 为key设置2s过期时间

  • pexpire key 2000: 为key设置2000ms过期时间

  • expireat key timestamp: 为key设置过期时间,指定时间戳过期

  • pexpireat key millseconds-timestamp: 为key设置过期时间,毫秒级时间戳(没用过)

  • persist key: 移除key过期时间

  • ttl key: 获取key的剩余过期时间

  • pttl key: 获取key的毫秒级剩余过期时间

  • move key 2: 将key移动到2库中

  • rename key newKey: 重命名

  • renamenx key newKey: 重命名,若newKey存在则不操作

查询

  • dump key: 返回序列化的值

  • exists key: 查看key是否存在

  • keys pattern: 获取所有符合匹配的key

    • pattern:* 表示所有, h* h开头, 等等

  • randomkey: 从当前库随机返回一个key

  • type key: 返回存储的数据类型

  • select 1: 选择1库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码整洁之道-函数

什么是一个好的函数或者叫方法,只要能让函数明确的表达其意图,让读者能够一眼看出是一个怎样的函数,其接收什么参数,返回什么结果,做了什么事情。能做到这,大概就能算作一个好的函数了,看上去很…

代码整洁之道-格式

对于代码的格式,每个人都有不同的代码风格,这没什么。但是对于一个团队来说,最好能够统一代码风格,在同一个项目中,如果到处充斥着不同的代码风格,相比读起来并不是那么让人舒适,比如在什么地方…

代码整洁之道-对象和数据结构

现在,有一个计算面积的需求,其中一种实现如下: class Square{public $side; } class Geometry{public function area($shape){if($shape instanceof Square){return $shape->side * $shape->side;}return 0;} }有人看了,你…

代码整洁之道-类

在面向对象的编程中,类是其中的基本单位,就像面向过程中的函数一样。所以在说类时,可以借鉴一下前面的函数,不如只做一件事,也就是所说的单一职责。 函数应该短小,对于类来说,也是这样。函数的…

Deepin nginx lumen配置

Deepin nginx lumen配置 正常安装 sudo apt install nginx sudo apt install php-fpm 启动后将 /etc/nginx/sites-enabled/default 配置文件 copy一份到 /etc/nginx/conf.d/lumen_demo.conf 然后按照该配置文件改改,修改后的配置文件如下: server {lis…

代码整洁之道小结

以下总结一些不好的代码规范, 借此警示自己不要犯这种错误 注释 1.不恰当的注释 注释应该仅用来描述有关代码和设计的技术性信息。像修改历史等信息不应出现在注释中 2.废弃的注释 过时、无关或错误的注释就是废弃的注释,不要写这种注释&#xff0c…

PHP的stdClass

概述 以下是百度百科对php中的 stdClass的描述: stdClass在PHP5才开始被流行。而stdClass也是zend的一个保留类。**stdClass类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL.**凡是用new stdClass()的…

浮点数的运算精度丢失

引出 打开Python编译器,输入 0.10.2, 期待的结果是0.3,但是输出为: 0.30000000000000004 有点小尴尬,这是为什么呢? 解惑 其实这设计到了计算机的浮点数存储是以二进制进行存储的。 说二进制不太形象&a…

补码到底是个什么东西

概述 先引入一个前提,在计算机中数字是以二进制进行存储的,也就是我们看到的2,在计算机中存储的是10。我们进行的加法运算 213 在计算机中是这样的(这里先假设计算机存储的是4位二进制数字) 001000010011 很容以看的…

揭开HTTPS的神秘面纱

在说HTTP前,一定要先介绍一下HTTP,这家伙应该不用过多说明了,大家每天都在用,每一次HTTP请求,都是一次TCP连接。遗憾的是,请求的内容在TCP报文中是明文传输的,任何人截取到请求都可以读取其中的…

递归函数两种方式的区别

概述 递归函数都不陌生&#xff0c;比如计算n的阶乘&#xff1a; function f($n){if($n < 1) return 1;return $n * f($n-1); } 当然&#xff0c;有人可能会这么写&#xff1a; function f($n, $result){if($n < 1) return $result;return f($n-1, $n*$result); } 上…

Trie树

概述 在Google中随意搜索&#xff0c;如下所示&#xff1a; 他会自动显示相关的搜索&#xff0c;不知道有没有想过这个功能是如何实现的呢&#xff1f;面对海量的数据&#xff0c;它怎么能在我输入的同时&#xff0c;如此快速的检索到相关内容呢&#xff1f;当我查找资料后&am…

Python元组是什么

引出 在使用Python过程中&#xff0c;列表、集合和字典是比较常用的数据结构。 列表简单说就是数组&#xff0c;不对&#xff0c;它就是数组 集合就是去重的元素结构&#xff0c;和JAVA中的set一样 字典就是一个key-value的键值对&#xff0c;和JAVA中的HashTable一样 但是…

B+树

引言 时隔一年&#xff0c;我又想起当初看数据库时&#xff0c;看到的B树&#xff0c;就是数据库的索引使用的数据结构。再整理一下&#xff0c;看看自己没有忘记很多吧。 概述 B树之前&#xff0c;先来看一下二叉查找树&#xff08;1,2,3,4,5,6,7&#xff09; 恩&#xff0…

关于相对性的思考

换位思考是一直都在倡导的做法。也就是说&#xff0c;在考虑问题时&#xff0c;不光要站在自己的角度来思考&#xff0c;还要站在他人的角度来思考。不光要站在一个角度思考&#xff0c;要尝试多个角度来思考问题。 下面一则小故事&#xff1a; 熊大&#xff1a;熊二&#xff…

Python导入运行的当前模块报错

引言 今天遇到了一个奇怪的现象&#xff0c;简单举个栗子&#xff1a; 文件结构如下&#xff1a; 其中tt.py文件中定义了一个方法&#xff1a; def tt():print(tt) 我现在要在test.py中使用tt(), 代码如下&#xff1a; from test.tt import tt ​ if __name__ __main__:t…

Python中的+=

引出 今天在运行之前写的一个Python脚本时&#xff0c;发生了一个奇怪的现象&#xff08;我怎么老遇到奇怪的现象&#xff5e;&#xff5e;&#xff09;。当时的代码大概长这样&#xff1a; a [1, 2, 3] b [4, 5, 6] # ...一大段逻辑 c a c b # ...一大段逻辑 # 在这里&a…

网络带宽是什么

引出 最近有盆友在购买云服务器&#xff0c;问我带宽选多大的比较合适&#xff1f;当时我说&#xff0c;就你这小网站&#xff0c;整个1M妥妥的。 也罢&#xff0c;就简单介绍一下带宽吧。 概述 其实简单的说&#xff0c;可以比作网速&#xff08;当然还是有区别的&#xf…

js new Date 创建时间默认是8点

起因 最近在写一个页面&#xff0c;需要用到时间控制。然后我通过new Date()传入日期字符串创建了一个对象&#xff0c;并与当前时间做时间戳比较&#xff0c;结果12点刚过&#xff0c;就出问题了。举个栗子&#xff1a; // 假设当前时间是2019年12月22日0点20分 new Date(20…

js解决客户端与服务器时间不一致的问题

引出 最近在写一个项目时&#xff0c;要根据时间进行不同的展示&#xff0c;直接用new Date().getTime()获取当前时间&#xff0c;结果就出问题了。有些用户擅自修改自己的本地时间&#xff0c;导致获取到的时间并不是当前时间&#xff0c;尴尬。 思路 既然如此&#xff0c;…