redis实战-命令

    xiaoxiao2021-03-25  44

    通用键值操作

    keys进行查看键值:正则进行匹配键:?*[] 127.0.0.1:6379> keys * 1) "name" 2) "guo" 127.0.0.1:6379> keys g* 1) "guo"

    注意:在生产环境中一般是不建议使用keys ,会造成性能问题,可以使用其他方式来存储key值。时间复杂度O(N),N为数据库的key的数量

    随机key randomkey 127.0.0.1:6379> randomkey "guo" 127.0.0.1:6379> randomkey "name" 判断键是否存在 127.0.0.1:6379> exists name (integer) 1 127.0.0.1:6379> exists age (integer) 0 127.0.0.1:6379> 删除key del key 127.0.0.1:6379> del name (integer) 1 127.0.0.1:6379> exists name (integer) 0 重命名rename key newkey;rename会覆盖原来的key127.0.0.1:6379> keys * 1) "age" 2) "name" 127.0.0.1:6379> rename age name OK 127.0.0.1:6379> keys * 1) "name" 127.0.0.1:6379> get name "shuai" 127.0.0.1:6379> renamenx key new key 如果原来的值存在则修改不生效 select num切换不同的redis数据库 默认redis有16个服务器database 16 move key dbnum用来移动不同的key到不同的数据库中,如果目标数据库已经存在key值,那么移动失败。 ttl key:查看key的有效期,-1表示永久保持,不过期,对于不存在的key会返回-2 127.0.0.1:6379> keys * 1) "age" 2) "name" 127.0.0.1:6379> ttl name (integer) -1 127.0.0.1:6379> ttl age (integer) 75 127.0.0.1:6379> ttl lin (integer) -2 127.0.0.1:6379> pttl key查看key的有效期,毫秒数为单位。 expire key 整型值,以秒为单位,设置key的有效期: 127.0.0.1:6379> expire name 1000 (integer) 1 127.0.0.1:6379> ttl name (integer) 996 127.0.0.1:6379> persist key:将某个key变成永久有效; pexpire site 9000;利用毫秒来作为单位;设置key值得有效期; persist key设置某个key为永久有效。

    字符串

    字符串存储三种类型值:1、字节串;2、整数;3、浮点数

    设置值 set key value ex num|px num nx|xx set key value ex 秒数|px 毫秒数 127.0.0.1:6379> set site www.baidu.com ex 10000 OK 127.0.0.1:6379> ttl site (integer) 9996 127.0.0.1:6379> set web test px 10000 OK 127.0.0.1:6379> ttl web (integer) 7 127.0.0.1:6379> nx:表示如果存在的时候就不进行操作。 xx:表示如果有存在的时候进行操作。 mset 一次性设置多个键值: 127.0.0.1:6379> mset a aman b bold c controller d diamond OK 127.0.0.1:6379> keys * 1) "site" 2) "a" 3) "c" 4) "b" 5) "name" 6) "d" 127.0.0.1:6379> get key获取值, mget keya keyb keyc 一次获取多个值。 setrange修改键某个偏移量的值,不够的话使用\x00来填充。 127.0.0.1:6379> mget a b c 1) "aman" 2) "bold" 3) "controller" 127.0.0.1:6379> setrange a 10 ?? (integer) 12 127.0.0.1:6379> setrange c 5 ** (integer) 10 127.0.0.1:6379> mget a c 1) "aman\x00\x00\x00\x00\x00\x00??" 2) "contr**ler" 127.0.0.1:6379> 对应的是getrange key start end 127.0.0.1:6379> mget a c 1) "aman\x00\x00\x00\x00\x00\x00??" 2) "contr**ler" 127.0.0.1:6379> getrange c 4 20 "r**ler" 127.0.0.1:6379> append key value向字符串的尾部加入内容。 127.0.0.1:6379> append c linjunbin (integer) 19 127.0.0.1:6379> get c "contr**lerlinjunbin" 127.0.0.1:6379> getset key newvalue获取并返回旧值并设置新值。 127.0.0.1:6379> set status sleep OK 127.0.0.1:6379> getset status sleeping "sleep" 127.0.0.1:6379> get status "sleeping" 127.0.0.1:6379> incr key 自增1,秒杀抢票工作。 >>> conn.get('key'); >>> conn.incr('key'); 1 >>> conn.get('key'); '1' decr key自减1 127.0.0.1:6379> incr num (integer) 101 127.0.0.1:6379> get num "101" 127.0.0.1:6379> decr num (integer) 100 127.0.0.1:6379> get num "100" incrby key number增长多少 decrby key number减少多少 incrbyfloat key number 增加多少浮点数。 在位上做操作: setbit key offset value设置offset对应二进制位上的值,返回该位上的旧值。如果offset 过大 getbit key offset查看某个字符串的二进制位数值。 127.0.0.1:6379> getbit num 0 (integer) 0 127.0.0.1:6379> getbit num 1 (integer) 0 127.0.0.1:6379> getbit num 0 (integer) 0 127.0.0.1:6379> getbit num 1 (integer) 0 127.0.0.1:6379> getbit num 2 (integer) 1 127.0.0.1:6379> getbit num 3 (integer) 1 127.0.0.1:6379> getbit num 4 (integer) 0 127.0.0.1:6379> getbit num 5 (integer) 0 127.0.0.1:6379> getbit num 6 (integer) 0 127.0.0.1:6379> getbit num 7 (integer) 1 127.0.0.1:6379> getbit num 8 (integer) 0 127.0.0.1:6379> 127.0.0.1:6379> get num "100" 127.0.0.1:6379> setbit num 2 0 (integer) 1 127.0.0.1:6379> get num "\x1100" 127.0.0.1:6379> setbit num 2 1 (integer) 0 127.0.0.1:6379> get num "100" bitcount key [start end]统计字符串的二进制位数。 bitop op dest-key keyname[keyname,keyname]对一个或者多个二进制位串执行包含andorxornot操作。

    列表

    redis列表允许用户从序列两边推入或者弹出元素,获取列表元素以及执行各种常见列表操作。

    元素1====>元素2====>元素3====>元素4

    lpush:向一个链表左边进行插入元素。 rpush listname value:向一个链表右边插入元素。 lrange listname start end:取出链表某个范围元素。 lpop,rpop向左或者向右弹出列表中元素。 127.0.0.1:6379> lpush character utf8 (integer) 1 127.0.0.1:6379> rpush character gbk (integer) 2 127.0.0.1:6379> rpush character unicode (integer) 3 127.0.0.1:6379> lrange character 0 10 1) "utf8" 2) "gbk" 3) "unicode" 127.0.0.1:6379> 127.0.0.1:6379> rpop character "unicode" 127.0.0.1:6379> lrange character 0 10 1) "utf8" 2) "gbk" 127.0.0.1:6379> rpop character "gbk" 127.0.0.1:6379> lrange character 0 10 1) "utf8" 127.0.0.1:6379> lindex list-name offset返回列表中偏移量的offset元素。 127.0.0.1:6379> lindex character 0 "utf8" 127.0.0.1:6379> lindex character 1 "gbk" 127.0.0.1:6379> lindex character 2 "ascii" 127.0.0.1:6379> ltrim list-name start end 对列表进行修剪 127.0.0.1:6379> lrange character 0 12 1) "utf8" 2) "gbk" 3) "ascii" 4) "gb2312" 5) "utf16" 6) "utf" 7) "32" 127.0.0.1:6379> ltrim character 0 2 OK 127.0.0.1:6379> lrange character 0 12 1) "utf8" 2) "gbk" 3) "ascii" 127.0.0.1:6379> llen list-name查看列表长度 127.0.0.1:6379> llen character (integer) 9 127.0.0.1:6379> linsert list-name after|before search-val insert-value 查找到某个值search-val之前或者之后插入value,一旦找到就结束不会往下查找。 127.0.0.1:6379> linsert character after b binsert (integer) 10 127.0.0.1:6379> lrange character 0 -1 1) "utf8" 2) "gbk" 3) "ascii" 4) "a" 5) "b" 6) "binsert" 7) "c" 8) "d" 9) "e" 10) "f" 127.0.0.1:6379> rpoplpush source dest把source的尾部拿出放在dest的头部,并返回该单元值。 场景:task+bak双链表完成安全队列。 task列表====弹出===>bak列表插入 任务列表假设你有a,b,c,d任务需要做,bak列表表示正在做的任务。 业务逻辑:使用两个链表完成安全队列。 1:Rpoplpush task bak 2:接收返回值,并做业务处理 3:如果成功,rpop bak 清除任务. 如不成功,下次从bak表里取任务。这样不会使得没有执行成功的任务丢失掉。 多了一个等待的过程: blpop listname [listname] timeout从第一个非空列表中弹出位于最左侧的元素,或者在timeout秒之内阻塞并等待可以弹出的元素出现。 一个等着直到timeout秒结束 brpop listname [listname] timeout rpoplpush brpoplpush 常用场景: 消息传递,任务队列场景: 长轮询Ajax,在线聊天时,能够用到 列表的一个主要优点: 它可以包含多个字符串,并且可以相同集中在同一个地方。

    示例:大量用户来进行统计,使用位图来进行统计用户登录情况。

    假设有7个用户,需要统计用户的每天是否登录情况,使用位图进行表示。0表示没有登录,1表示登录 1010101第一位表示user1登录情况,可以使用位操作来统计。 场景: 1亿个用户, 每个用户 登陆/做任意操作 ,记为 今天活跃,否则记为不活跃 每周评出: 有奖活跃用户: 连续7天活动 每月评,等等... 思路: Userid dt active 1 2013-07-27 1 1 2013-0726 1 如果是放在表中, 1:表急剧增大,2:要用group ,sum运算,计算较慢 用: 位图法 bit-map Log0721: ‘011001...............0...... log0726 : ‘011001...............0’ Log0727 : ‘0110000.............11: 记录用户登陆: 每天按日期生成一个位图, 用户登陆后,把user_id位上的bit值置为1 2: 把1周的位图 and 计算, 位上为1的,即是连续登陆的用户 redis 127.0.0.1:6379> setbit mon 100000000 0 (integer) 0 redis 127.0.0.1:6379> setbit mon 3 1 (integer) 0 redis 127.0.0.1:6379> setbit mon 5 1 (integer) 0 redis 127.0.0.1:6379> setbit mon 7 1 (integer) 0 redis 127.0.0.1:6379> setbit thur 100000000 0 (integer) 0 redis 127.0.0.1:6379> setbit thur 3 1 (integer) 0 redis 127.0.0.1:6379> setbit thur 5 1 (integer) 0 redis 127.0.0.1:6379> setbit thur 8 1 (integer) 0 redis 127.0.0.1:6379> setbit wen 100000000 0 (integer) 0 redis 127.0.0.1:6379> setbit wen 3 1 (integer) 0 redis 127.0.0.1:6379> setbit wen 4 1 (integer) 0 redis 127.0.0.1:6379> setbit wen 6 1 (integer) 0 redis 127.0.0.1:6379> bitop and res mon feb wen (integer) 12500001 如上例,优点: 1: 节约空间, 1亿人每天的登陆情况,用1亿bit,约1200WByte,约10M 的字符就能表示 2: 计算方便

    集合set

    1、无序性。2、唯一性。3、确定性。没有顺序所以不像列表有下标,就无所谓从左还是从右插入。

    sadd key-name member [member member]新增一个集合元素, smembers key-name查看集合的元素。 127.0.0.1:6379> sadd sex man woman (integer) 2 127.0.0.1:6379> smembers sex 1) "man" 2) "woman" 127.0.0.1:6379> sadd sex man (integer) 0 127.0.0.1:6379> smembers sex 1) "man" 2) "woman" 127.0.0.1:6379> srem key-name item [item] 删除集合中的元素 127.0.0.1:6379> srem sex man a (integer) 1 127.0.0.1:6379> smembers sex 1) "woman" 127.0.0.1:6379> spop key-name随机溢出集合中的一个元素,并返回被移除的元素。 127.0.0.1:6379> smembers sex 1) "a" 2) "l" 3) "n" 4) "b" 5) "m" 6) "f" 7) "d" 8) "woman" 9) "j" 10) "k" 11) "e" 12) "h" 13) "i" 14) "c" 15) "g" 127.0.0.1:6379> spop sex "k" 127.0.0.1:6379> spop sex "h" 127.0.0.1:6379> spop sex "e" 127.0.0.1:6379> spop sex "i" 127.0.0.1:6379> smembers sex 1) "a" 2) "l" 3) "n" 4) "b" 5) "m" 6) "f" 7) "d" 8) "woman" 9) "j" 10) "c" 11) "g" 127.0.0.1:6379> 应用场景:可以用于抽奖。 srandmember key-name返回集合中的一个元素 127.0.0.1:6379> srandmember sex "m" 127.0.0.1:6379> srandmember sex "a" 127.0.0.1:6379> srandmember sex "d" 127.0.0.1:6379> srandmember sex "n" 127.0.0.1:6379> srandmember sex "m" sismember key-name item查看item是否存在某集合中。 127.0.0.1:6379> sismember sex a (integer) 1 127.0.0.1:6379> sismember sex z (integer) 0 scard key查询集合中的元素个数 127.0.0.1:6379> scard sex (integer) 11 127.0.0.1:6379> smove source-key dest-key item 如果集合source-key包含元素item 那么从集合source-key里面移除item添加到dest-key中,成功移除返回1,否则返回0 127.0.0.1:6379> sadd name lin (integer) 1 127.0.0.1:6379> smove sex name woman (integer) 1 127.0.0.1:6379> sadd name a l n (integer) 3 127.0.0.1:6379> smove sex name a (integer) 1 127.0.0.1:6379> smembers name 1) "l" 2) "woman" 3) "lin" 4) "a" 5) "n" 127.0.0.1:6379> smove sex name n (integer) 1 127.0.0.1:6379> sdiff key-name [key-name] 返回那些存在第一个集合、不存在其他集合中的元素 127.0.0.1:6379> sdiff lisi wangwu poly 1) "b" 127.0.0.1:6379> sdiff lisi wangwu 1) "b" 2) "d" 127.0.0.1:6379> sdiff lisi poly 1) "c" 2) "b" 127.0.0.1:6379> sinter key-name [key-name key-name]返回集合中的交集 127.0.0.1:6379> sinter lisi wangwu poly 1) "a" 对应的sinterstore返回交集存储。 sdiffstore dest key-name key-name [key-name...] 将差集存入dest集合中 127.0.0.1:6379> sdiffstore diff lisi wangwu (integer) 2 127.0.0.1:6379> smembers diff 1) "b" 2) "d" 127.0.0.1:6379> sunion key-name [key-name...]返回那些至少存在一个集合的元素,表示并集 sunionstore dest key-name [key-name...] 127.0.0.1:6379> smembers name 1) "woman" 2) "lin" 3) "a" 4) "l" 5) "n" 127.0.0.1:6379> sunion name sex 1) "f" 2) "m" 3) "woman" 4) "a" 5) "l" 6) "n" 7) "b" 8) "d" 9) "j" 10) "lin" 11) "c" 12) "g" 127.0.0.1:6379>

    有序集合

    有序集合存储着成员与分值之间的映射,必须要有相应的元素权重。以及根据分值大小有序的获取或者扫描成员和分值。

    zadd key-name score item score item添加一个有序集合元素。需要加上权重 127.0.0.1:6379> zadd class 12 lily 13 lucy 18 lilei 6 poly (integer) 4 127.0.0.1:6379> zrange class 0 1 1) "poly" 2) "lily" 127.0.0.1:6379> 查询第几个到第几个之间的。 zrange key-name start end取出有序集合中按照排序的开始和结束元素集合。 127.0.0.1:6379> zrange class 0 -1 withscores 1) "poly" 2) "6" 3) "lily" 4) "12" 5) "lucy" 6) "13" 7) "lilei" 8) "18" 9) "lin" 10) "90" 127.0.0.1:6379> 根据权重值范围来进行过滤zrangebyscore,还可以支持limit来过滤展示条目 withscores 表示同时返回权重值。 127.0.0.1:6379> zrangebyscore class 0 20 limit 0 1 1) "poly" 127.0.0.1:6379> zrangebyscore class 0 20 1) "poly" 2) "lily" 3) "lucy" 4) "lilei" 127.0.0.1:6379> 127.0.0.1:6379> zrangebyscore class 0 20 withscores 1) "poly" 2) "6" 3) "lily" 4) "12" 5) "lucy" 6) "13" 7) "lilei" 8) "18" 127.0.0.1:6379> zcard表示获取集合中的元素个数 127.0.0.1:6379> zcard class (integer) 5 zcount表示获取集合中权重范围的元素个数,统计个数。 127.0.0.1:6379> zcount class 0 50 (integer) 4 zrank key-name item获取有序集合item的排名 127.0.0.1:6379> zrank class lucy (integer) 2 127.0.0.1:6379> zrank class lilei (integer) 3 zrevrank反序获取排名 127.0.0.1:6379> zrevrank class lilei (integer) 1 127.0.0.1:6379> zrevrank class lucy (integer) 2 127.0.0.1:6379> zrevrank class poly (integer) 4 zrem key-name item item删除有序集合中的元素 127.0.0.1:6379> zrem class poly lily lilei (integer) 3 127.0.0.1:6379> zrange class 0 -1 withscores 1) "lucy" 2) "13" 3) "lin" 4) "90" zremrangebyscore根据权重范围进行删除 zremrangebyrank根据排序范围进行删除 127.0.0.1:6379> zrange class 0 -1 withscores 1) "lisi" 2) "8" 3) "gou" 4) "9" 5) "lucy" 6) "13" 7) "lin" 8) "90" 9) "tt" 10) "90" 11) "linjunbin" 12) "100" 127.0.0.1:6379> zremrangebyscore class 9 20 (integer) 3 127.0.0.1:6379> zrange class 0 -1 1) "lisi" 2) "lin" 3) "tt" 127.0.0.1:6379> zremrangebyrank class 0 1 (integer) 2 127.0.0.1:6379> zrange class 0 -1 1) "tt" 127.0.0.1:6379> zincrby key-name num member 将member成员的权重分值加上num。 127.0.0.1:6379> zincrby class 10 tt "100" 127.0.0.1:6379> zrange class 0 -1 withscores 1) "tt" 2) "100" zinterstore对给定的有序集合执行类似集合中的交集运算,并存储结果 zinterstore key-name key-number key-name [key-name...] [aggregate sum|mim|max] key-number表示后面交集的数量。默认是求和,可以使用其他运算。 127.0.0.1:6379> zinterstore res 2 lisi wang aggregate sum (integer) 3 127.0.0.1:6379> zrange res 0 -1 withscores 1) "cat" 2) "5" 3) "dog" 4) "11" 5) "horse" 6) "14" 127.0.0.1:6379> 设置权重weight可以对两个或者多个有序集合加上权重。 zunionstore 求并集。

    哈希hash结构

    hset:设置hash值对应的是hget hmset一次性设置hash值,hgetall对应过来。 127.0.0.1:6379> hset user1 name linjunbin (integer) 1 127.0.0.1:6379> hset user1 age 30 (integer) 1 127.0.0.1:6379> hset user1 height 175 (integer) 1 127.0.0.1:6379> hgetall user1 1) "name" 2) "linjunbin" 3) "age" 4) "30" 5) "height" 6) "175" 127.0.0.1:6379> hget user1 name "linjunbin" 127.0.0.1:6379> hmset user2 name lin age 80 height 130 OK 127.0.0.1:6379> hgetall user2 1) "name" 2) "lin" 3) "age" 4) "80" 5) "height" 6) "130" hdel进行删除hash中的某个值。 127.0.0.1:6379> hdel user2 name (integer) 1 127.0.0.1:6379> hgetall user2 1) "age" 2) "80" 3) "height" 4) "130" 查看hash中的元素个数。 127.0.0.1:6379> hlen user2 (integer) 2 127.0.0.1:6379> hlen user3 (integer) 0 127.0.0.1:6379> hlen user1 (integer) 3 hexists判断某个索引是否在hash里面 127.0.0.1:6379> hexists user1 name (integer) 1 127.0.0.1:6379> hexists user1 tt (integer) 0 对hash里面的值进行自增hincrby,hincrbyfloat 127.0.0.1:6379> hincrby user1 age 20 (integer) 50 127.0.0.1:6379> hget user1 age "50" 127.0.0.1:6379> hincrbyfloat user1 age 0.5 "50.5" hkeys:返回hash中所有的key值。 hvals:返回hash中所有的value值。

    redis事务及锁应用

    multi:表示接下来需要输入多个命令,接下来的命令会放在队列里面queue,在执行过程中不允许其他客户端命令发过来。exec会一条一条执行过去,但是如果中间出现执行错误的话,错误之前执行的也将不会回滚。执行正确的语句,跳过不正确的语句。

    discard表示取消队列

    127.0.0.1:6379> set wang 200 OK 127.0.0.1:6379> set zhao 700 OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> decrby zhao 100 QUEUED 127.0.0.1:6379> incrby wang 100 QUEUED 127.0.0.1:6379> exec 1) (integer) 600 2) (integer) 300 127.0.0.1:6379> get zhao "600" 127.0.0.1:6379> get wang "300" 中间错误流程,错误之前执行的语句不会回滚。 descard:表示取消队列。 127.0.0.1:6379> multi OK 127.0.0.1:6379> decrby zhao 100 QUEUED 127.0.0.1:6379> incrby wang 100 QUEUED 127.0.0.1:6379> discard OK 127.0.0.1:6379> mget zhao wang 1) "600" 2) "300" 127.0.0.1:6379>

    买票场景:春节买票,多人买票,票数有限,需要先进行扣款,后出票。出票失败退还金额

    悲观锁:给ticket上锁,只能我来操作。 乐观:监视ticket数量,不上锁,值改变了不进行操作。watch 127.0.0.1:6379> set lisi 300 OK 127.0.0.1:6379> set wangwu 3000 OK 127.0.0.1:6379> mget lisi wangwu ticket 1) "300" 2) "3000" 3) "1" 使用watch key-name key-name用来监视某个键值的变化。一旦变化就执行失败。 127.0.0.1:6379> watch ticket OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> decr ticket QUEUED 127.0.0.1:6379> decrby lisi 100 QUEUED 127.0.0.1:6379> exec (nil) 127.0.0.1:6379> mget ticket lisi 1) "0" 2) "300" unwatch取消监视。 127.0.0.1:6379> unwatch OK

    频道发布与订阅

    客户端订阅某些频道,如果有更新就发布到这些订阅者。publish====>频道====>subscribe订阅。

    subscribe news订阅新闻频道

    publish news内容–发布新闻内容 适宜做在线聊天,消息推送

    发布者 127.0.0.1:6379> publish news 'today is sunshine' (integer) 0 127.0.0.1:6379> publish news 'torrorow is sunshine' (integer) 1 订阅者 127.0.0.1:6379> subscribe news Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "news" 3) (integer) 1 1) "message" 2) "news" 3) "torrorow is sunshine"

    psubscribe pattern对订阅进行正则订阅。

    127.0.0.1:6379> publish news 'today is sunshine' (integer) 0 127.0.0.1:6379> publish news 'torrorow is sunshine' (integer) 1 127.0.0.1:6379> publish newstop 'this is top new' (integer) 0 127.0.0.1:6379> publish newstop 'this is top news' (integer) 1 127.0.0.1:6379> publish news 'torrorow is sunshines' (integer) 1 127.0.0.1:6379> psubscribe new* Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "new*" 3) (integer) 1 1) "pmessage" 2) "new*" 3) "newstop" 4) "this is top news" 1) "pmessage" 2) "new*" 3) "news" 4) "torrorow is sunshines"

    unsubscribe取消订阅 punsubscribe正则取消订阅

    转载请注明原文地址: https://ju.6miu.com/read-26177.html

    最新回复(0)