127.0.0.1:6379> keys * #查看所有的key (empty array) 127.0.0.1:6379> set name zhoudian # set key OK 127.0.0.1:6379> keys * 1) "name" 127.0.0.1:6379> set age 1 OK 127.0.0.1:6379> key * (error) ERR unknown command `key`, with args beginning with: `*`, 127.0.0.1:6379> keys* (error) ERR unknown command `keys*`, with args beginning with: 127.0.0.1:6379> keys * 1) "name" 2) "age" 127.0.0.1:6379> exists name #判断当前的key是否存在 (integer) 1 127.0.0.1:6379> exists name1 (integer) 0 127.0.0.1:6379> move name 1 #把key为“name”的数据移动到数据库1中 (integer) 1 127.0.0.1:6379> keys * 1) "age" 127.0.0.1:6379> set name zhoudian OK 127.0.0.1:6379> keys * 1) "name" 2) "age" 127.0.0.1:6379> get name "zhoudian" 127.0.0.1:6379> expire name 10 #设置key的过期时间,单位是秒 (integer) 1 127.0.0.1:6379> ttl name (integer) 5 127.0.0.1:6379> ttl name (integer) 4 127.0.0.1:6379> ttl name (integer) 3 127.0.0.1:6379> ttl name (integer) 2 127.0.0.1:6379> ttl name (integer) 1 127.0.0.1:6379> ttl name (integer) 1 127.0.0.1:6379> ttl name (integer) -2 127.0.0.1:6379> ttl name (integer) -2
127.0.0.1:6379> expire name 10 (integer) 0 127.0.0.1:6379> get name (nil) 127.0.0.1:6379> keys * 1) "age" 127.0.0.1:6379> type name none 127.0.0.1:6379> type age # 查看当前key的类型 string
#替换! 127.0.0.1:6379> set key2 abcdefg OK 127.0.0.1:6379> get key2 "abcdefg" 127.0.0.1:6379> setrange key2 1 xx #替换指定位置开始的字符串 (integer) 7 127.0.0.1:6379> get key2 "axxdefg"
############################################################################ #setex(set with expire) #设置过期时间 #setnx(set if not exist) #不存在在设置(在分布式锁中会常常使用)
127.0.0.1:6379> getset db redis #如果不存在值,则返回nil (nil) 127.0.0.1:6379> get db "redis" 127.0.0.1:6379> getset db mongodb #如果存在值,获取原来的值,并设置新的值 "redis" 127.0.0.1:6379> get db "mongodb"
########################################################################## 127.0.0.1:6379> lpush list #将一个值或多个值插入列表头部 (integer) 1 127.0.0.1:6379> lpush list two (integer) 2 127.0.0.1:6379> lpush list three (integer) 3 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "two" 3) "one" 127.0.0.1:6379> lrange list 0 1 1) "three" 2) "two" 127.0.0.1:6379> rpush list right #将一个值或多个值插入列表尾部 (integer) 4 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "two" 3) "one" 4) "right" ########################################################################## LPOP RPOP 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "two" 3) "one" 4) "right" 127.0.0.1:6379> lpop list #移除list的第一个元素 "three" 127.0.0.1:6379> lrange list 0 -1 1) "two" 2) "one" 3) "right" 127.0.0.1:6379> rpop list #移除list的最后一个元素 "right" 127.0.0.1:6379> lrange list 0 -1 1) "two" 2) "one" ########################################################################## Lindex 127.0.0.1:6379> lrange list 0 -1 1) "two" 2) "one" 127.0.0.1:6379> lindex list 1 #通过下标获得list的某一个值 "one" 127.0.0.1:6379> lindex list 0 "two" ########################################################################## Llen
127.0.0.1:6379> lpush list one (integer) 1 127.0.0.1:6379> lpush list two (integer) 2 127.0.0.1:6379> lpush list three (integer) 3 127.0.0.1:6379> llen list (integer) 3 ########################################################################## 移除指定的值 取关 uid
Lrem 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "three" 3) "two" 4) "one" 127.0.0.1:6379> lrem list 1 one #移除list集合中指定个数的value,精准匹配 (integer) 1 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "three" 3) "two" 127.0.0.1:6379> lrem list 1 three (integer) 1 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "two" 127.0.0.1:6379> lpush list three (integer) 3 127.0.0.1:6379> lrem list 2 three (integer) 2 127.0.0.1:6379> lrange list 0 -1 1) "two"
########################################################################## trim 修建:list截断!
127.0.0.1:6379> exists list #判断这个列表是否存在 (integer) 0 127.0.0.1:6379> lset list 0 item #如果不存在列表我们去更新就会报错 (error) ERR no such key 127.0.0.1:6379> lpush list value1 (integer) 1 127.0.0.1:6379> lrange list 0 0 1) "value1" 127.0.0.1:6379> lset list 0 item #如果存在,更新当前下标的值 OK 127.0.0.1:6379> lrange list 0 0 1) "item" 127.0.0.1:6379> lset list 1 other #如果不存在,就会报错 (error) ERR index out of range
127.0.0.1:6379> PFadd mykey a b c b e f g h #创建第一组元素 mykey (integer) 1 127.0.0.1:6379> pfcount mykey #统计mykey元素的基数数量 (integer) 7 127.0.0.1:6379> pfadd mykey2 a v e f g a f g #创建第二组元素mykey2 (integer) 1 127.0.0.1:6379> pfcount mykey2 (integer) 5 127.0.0.1:6379> pfmerge mykey3 mykey mykey2 合并两组取并集 mykey + mykey2 => mykey3 OK 127.0.0.1:6379> pfcount mykey3 #看并集的数量 (integer) 8
127.0.0.1:6379> multi #开启事务 OK #命令入队 127.0.0.1:6379(TX)> set k1 v1 QUEUED 127.0.0.1:6379(TX)> set k2 v2 QUEUED 127.0.0.1:6379(TX)> get k2 QUEUED 127.0.0.1:6379(TX)> set k3 v3 QUEUED 127.0.0.1:6379(TX)> exec#执行事务 1) OK 2) OK 3) "v2" 4) OK
放弃事务!
1 2 3 4 5 6 7 8 9 10 11 12 13
127.0.0.1:6379> multi #开启事务 OK 127.0.0.1:6379(TX)> set k1 v1 QUEUED 127.0.0.1:6379(TX)> set k2 v2 QUEUED 127.0.0.1:6379(TX)> set k4 v4 QUEUED 127.0.0.1:6379(TX)> discard #取消事务 OK 127.0.0.1:6379> get k4 #事务队列中命令都不会被执行 (nil)
编译型异常(代码有问题!命令有错!),事务中的所有命令都不会被执行!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set k1 v1 QUEUED 127.0.0.1:6379(TX)> set k2 v2 QUEUED 127.0.0.1:6379(TX)> set k3 v3 QUEUED 127.0.0.1:6379(TX)> getset k3 (error) ERR wrong number of arguments for'getset'command 127.0.0.1:6379(TX)> set k4 v4 QUEUED 127.0.0.1:6379(TX)> set k5 v5 QUEUED 127.0.0.1:6379(TX)> exec (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> get k5 (nil)
127.0.0.1:6379> set k1 "v1" OK 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> incr k1 #执行的时候失败 QUEUED 127.0.0.1:6379(TX)> set k2 v2 QUEUED 127.0.0.1:6379(TX)> set k3 v3 QUEUED 127.0.0.1:6379(TX)> get k3 QUEUED 127.0.0.1:6379(TX)> exec 1) (error) ERR value is not an integer or out of range #虽然第一条命令报错了,但是依旧正常执行成功! 2) OK 3) OK 4) "v3" 127.0.0.1:6379> get k2 "v2" 127.0.0.1:6379> get k3 "v3"
127.0.0.1:6379> set money 100 OK 127.0.0.1:6379> set out 0 OK 127.0.0.1:6379> watch money #监视 money对象 OK 127.0.0.1:6379> multi #事务正常结束,数据期间没有发生变动,这个时候救护正常执行成功 OK 127.0.0.1:6379(TX)> decrby money 20 QUEUED 127.0.0.1:6379(TX)> incrby out 20 QUEUED 127.0.0.1:6379(TX)> exec 1) (integer) 80 2) (integer) 20
测试多线程修改值,使用watch可以当做redis的乐观锁操作!
1 2 3 4 5 6 7 8 9 10 11
127.0.0.1:6379> watch money #监视 money OK 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> decrby money 10 QUEUED 127.0.0.1:6379(TX)> incrby out 10 QUEUED 127.0.0.1:6379(TX)> # 执行之前,另外一个线程修改了我们的值,这个时候就会导致事务执行失败 (nil)