从左边插入自然是倒着的。lpop与rpop:从链表左端或者链表右端弹出值删除指定的值RedisLrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。COUNT 的值" /> 从左边插入自然是倒着的。lpop与rpop:从链表左端或者链表右端弹出值删除指定的值RedisLrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。COUNT 的值"/>
作者:徐家三少
juejin.im/post/5880590d1b69e60058c72803
[root@server1 redis-3.0.5]# make
指定安装目录:
[root@server1 redis-3.0.5]# make PREFIX=/usr/local/redis install
进入/usr/local/redis里面:
[root@server1 redis]# lsbin[root@server1 redis]# cd bin[root@server1 bin]# lsredis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server
[root@server1 bin]# cp /root/redis-3.0.5/redis.conf redis.conf
启动:
[root@server1 bin]# ./redis-server redis.conf
出现:
这只是前台启动,关闭终端自动停止。
新建一个窗口,进入终端命令:
[root@server1 ~]# cd /usr/local/redis[root@server1 redis]# lsbin[root@server1 redis]# cd bin[root@server1 bin]# lsredis-benchmark redis-check-dump redis.conf redis-serverredis-check-aof redis-cli redis-sentinel[root@server1 bin]# ./redis-cli127.0.0.1:6379> 127.0.0.1:6379> set title adcdOK127.0.0.1:6379> get title"adcd"127.0.0.1:6379> set title 2OK127.0.0.1:6379> get title"2"127.0.0.1:6379>
让redis进程在后台运行
./redis-server& redis.conf
另一种方式就是修改后台文件:
[root@server1 bin]# vim redis.conf
将daemonize no变成 yes然后:
[root@server1 bin]# ./redis-server redis.conf
高版本会遇到的奇怪问题:
http://blog.csdn.net/qq_25797077/article/details/51986455
127.0.0.1:6379> set title 1234OK127.0.0.1:6379> set name jerryOK127.0.0.1:6379> keys *1) "title"2) "name"127.0.0.1:6379>
keys * 命令查找当前库下面所有的key值。keys 后面可以跟上一个正则表达式。
当key不存在时:
127.0.0.1:6379> keys age(empty list or set)
randomkey
127.0.0.1:6379> randomkey"name"127.0.0.1:6379> randomkey"name"127.0.0.1:6379> randomkey"title"127.0.0.1:6379> randomkey"title"127.0.0.1:6379> randomkey"name"127.0.0.1:6379> randomkey"title"127.0.0.1:6379> randomkey"name"127.0.0.1:6379> randomkey"sex"
exists key +key名字
1表示存在,0表示不存在
127.0.0.1:6379> exists key name(integer) 1127.0.0.1:6379> exists key birthday(integer) 0127.0.0.1:6379>
del key1 key2 ...
127.0.0.1:6379> del title(integer) 1127.0.0.1:6379> keys *1) "sex"2) "name"127.0.0.1:6379> 127.0.0.1:6379> del sex name(integer) 2127.0.0.1:6379> keys *(empty list or set)127.0.0.1:6379>
127.0.0.1:6379> set name jerryOK127.0.0.1:6379> set age 24OK127.0.0.1:6379> set sex 1OK127.0.0.1:6379> keys *1) "sex"2) "age"3) "name"127.0.0.1:6379> rename name nicknameOK127.0.0.1:6379> keys *1) "nickname"2) "sex"3) "age"127.0.0.1:6379>
如果试图修改一个不存在的key,将会报出错误:
127.0.0.1:6379> rename name nickname(error) ERR no such key
但是有一种情况,如果说改名后的新的key名已经存在,那么原来的key该怎么办呢?
127.0.0.1:6379> rename sex ageOK127.0.0.1:6379> get age"1"127.0.0.1:6379>
请注意,age原来是24.现在是1.
127.0.0.1:6379> set name jerryOK127.0.0.1:6379> set age 24OK127.0.0.1:6379> set sex 1OK
127.0.0.1:6379> renamenx sex age
如果修改成功,将返回1,修改失败(不作任何操作)将返回0
cat redis.conf可以查看到 redis在初始化的时候为我们初始化了16个数据库。redis默认使用0号数据库。并告知使用select 命令来选择数据库:
# Set the number of databases. The default database is DB 0, you can select# a different one on a per-connection basis using SELECT <dbid> where# dbid is a number between 0 and 'databases'-1databases 16
假设超过了数据库的索引,就会报出非法的DB索引:
127.0.0.1:6379> select 23(error) ERR invalid DB index127.0.0.1:6379>
127.0.0.1:6379> keys *1) "nickname"2) "sex"3) "age"127.0.0.1:6379> move sex 1(integer) 1127.0.0.1:6379> keys *1) "nickname"2) "age"127.0.0.1:6379>
此时选择1号数据库:
127.0.0.1:6379> select 1OK127.0.0.1:6379[1]> keys *1) "sex"127.0.0.1:6379[1]>
memcache有有效期,即使设置为永不失效,也只能保存30天。redis本身是当做存储的,所以没有有效期,即永远不失效。
1.ttl查询有效期,默认返回秒单位计时
127.0.0.1:6379> keys *1) "nickname"2) "age"127.0.0.1:6379> ttl age(integer) -1127.0.0.1:6379>
返回-1表示永久有效
如果查询一个不在的key的生命周期,将会返回-2(2.8以后)
127.0.0.1:6379> ttl gender(integer) -2
2.expire设置有效期,是用秒作为单位的。
127.0.0.1:6379> expire age 10(integer) 1127.0.0.1:6379> get age"24"127.0.0.1:6379> get age"24"127.0.0.1:6379> get age(nil)127.0.0.1:6379>
3.pttl和pexpire:使用毫秒作为声明周期
127.0.0.1:6379> pttl age(integer) -1127.0.0.1:6379> pexpire age 100000(integer) 1127.0.0.1:6379> pttl age(integer) 97177127.0.0.1:6379> pttl age(integer) 94561127.0.0.1:6379> pttl age(integer) 93000127.0.0.1:6379> pttl age(integer) 91937127.0.0.1:6379>
127.0.0.1:6379> set age 24OK127.0.0.1:6379> expire age 20(integer) 1127.0.0.1:6379> ttl age(integer) 14127.0.0.1:6379> persist age(integer) 1127.0.0.1:6379> ttl age(integer) -1127.0.0.1:6379>
对相同的key多次设置值,会直接覆盖:
127.0.0.1:6379> flushdbOK127.0.0.1:6379> keys *(empty list or set)127.0.0.1:6379> set name jerryOK127.0.0.1:6379> set name herryOK127.0.0.1:6379> get name"herry"127.0.0.1:6379>
使用set keyname value nx来保证如果已经有这个key就不做任何操作,防止key被覆盖:
127.0.0.1:6379> set site www.baodu.comOK127.0.0.1:6379> set site www.taobao.com nx(nil)127.0.0.1:6379> get site"www.baodu.com"127.0.0.1:6379>
此外还有一个xx选项。
append :追加
setrange 与 getrange
getset:先得到旧的值,再设置新值
127.0.0.1:6379> set status sleepOK127.0.0.1:6379> getset status work"sleep"127.0.0.1:6379> get status"work"127.0.0.1:6379>
incr 与 decr
127.0.0.1:6379> set age 20OK127.0.0.1:6379> incr age(integer) 21127.0.0.1:6379> get age"21"127.0.0.1:6379> decr age(integer) 20127.0.0.1:6379>
如果是一个字符串呢?
127.0.0.1:6379> incr status(error) ERR value is not an integer or out of range127.0.0.1:6379>
redis:秒杀系统的设计与实践
127.0.0.1:6379> incrby age 5(integer) 25127.0.0.1:6379>
127.0.0.1:6379> incrbyfloat age 0.6"25.6"
位操作就是在 0和1 位上来操作。
127.0.0.1:6379> set char AOK127.0.0.1:6379> setbit char 2 1(integer) 0127.0.0.1:6379> get char"a"127.0.0.1:6379>
上图演示了对char这个key 进行位操作,引用:
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节
redis存储是UTF-8.之所以能够位操作,就是因为与acii码保持了统一。不然就不是offset2了。
使用redis的位操作可以用来统计在线人数等等…
https://www.zhihu.com/question/20001177
redis的位操作offset过大,就会填充0。与本身存储的大小无关。
127.0.0.1:6379> set name "你好"OK127.0.0.1:6379> get name"\xe4\xbd\xa0\xe5\xa5\xbd"127.0.0.1:6379> setbit name 5 0(integer) 1127.0.0.1:6379> get name"\xe0\xbd\xa0\xe5\xa5\xbd"127.0.0.1:6379>
你好,总共是两个汉字,6个字节。
redis所有的存储都是string,set int 1 实际上是 存储了1这个字符串(ascii编码)
实际上,可以直接设置位,比如:127.0.0.1:6379> setbit lower 2 1lower并不存在,设置完毕以后就是 00100000
127.0.0.1:6379> setbit lower 2 1(integer) 0127.0.0.1:6379> get lower" "127.0.0.1:6379> setbit lower 3 1(integer) 0127.0.0.1:6379> get lower"0"127.0.0.1:6379>
打印出0,因为0的ascii码就是00110000。
假设有这样一个需求,要将大写的字符始终转换成小写的字符,可以使用bittop来操作。
由于小写字母的整数值始终比大写字母多32,可以使用OR操作来直接位运算:
127.0.0.1:6379> flushdbOK127.0.0.1:6379> setbit lower 2 1(integer) 0127.0.0.1:6379> set char QOK127.0.0.1:6379> bitop or char char lower(integer) 1127.0.0.1:6379> get char"q"127.0.0.1:6379>
bitop中的第一个参数or可以是 and,or,not, xor
第二个参数是结果存放于哪个key
第三,四个参数表示 操作的两个key
lpush 链表名(key) 值
像这个链表左端推入,
rpush 链表名(key) 值
从这个链表左端插入。
127.0.0.1:6379> lpush list a //从list这个链表左端插入a,如下以此类推(integer) 1127.0.0.1:6379> rpush list b(integer) 2127.0.0.1:6379> rpush list c(integer) 3127.0.0.1:6379> lpush list 0(integer) 4127.0.0.1:6379> lrange 0 4(error) ERR wrong number of arguments for 'lrange' command127.0.0.1:6379> lrange list 0 41) "0"2) "a"3) "b"4) "c"127.0.0.1:6379>
lrange list 0 4 查看链表内容。从左边则是0开始,右边是-1开始,因为事先真不知道链表个数
所以要查看所有的内容,可以:
lrange list 0 -1
lpush与rpush也支持一次性插入多个值:
127.0.0.1:6379> lpush anwser a b c d e f g(integer) 7127.0.0.1:6379> lrange anwser 0 -11) "g"2) "f"3) "e"4) "d"5) "c"6) "b"7) "a"127.0.0.1:6379>
从左边插入自然是倒着的。
删除指定的值
Redis Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
COUNT 的值可以是以下几种:
127.0.0.1:6379> rpush anwser a b b b c d e f g(integer) 9127.0.0.1:6379> rrme anwser 2 b(error) ERR unknown command 'rrme'127.0.0.1:6379> rrem anwser 2 b(error) ERR unknown command 'rrem'127.0.0.1:6379> lrem anwser 2 b(integer) 2127.0.0.1:6379> lrange anwser 0 -11) "a"2) "b"3) "c"4) "d"5) "e"6) "f"7) "g"127.0.0.1:6379>
查看集群目前状况
redis-cli -c -p 16001
打印集群的信息
cluster info
列出集群当前已知的所有节点(node),以及这些节点的相关信息。
cluster nodes