从左边插入自然是倒着的。lpop与rpop:从链表左端或者链表右端弹出值删除指定的值RedisLrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。COUNT 的值" /> 从左边插入自然是倒着的。lpop与rpop:从链表左端或者链表右端弹出值删除指定的值RedisLrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。COUNT 的值"/>

Redis初学者到专家:一站式简明教程

发表时间: 2020-04-19 06:01

作者:徐家三少

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:6379set title 1234OK127.0.0.1:6379set name jerryOK127.0.0.1:6379keys *1) "title"2) "name"127.0.0.1:6379>

keys * 命令查找当前库下面所有的key值。keys 后面可以跟上一个正则表达式。

当key不存在时:

127.0.0.1:6379keys age(empty list or set)

随机的获取一个key

randomkey

127.0.0.1:6379randomkey"name"127.0.0.1:6379randomkey"name"127.0.0.1:6379randomkey"title"127.0.0.1:6379randomkey"title"127.0.0.1:6379randomkey"name"127.0.0.1:6379randomkey"title"127.0.0.1:6379randomkey"name"127.0.0.1:6379randomkey"sex"

判断key是否存在

exists key +key名字

1表示存在,0表示不存在

127.0.0.1:6379exists key name(integer) 1127.0.0.1:6379exists key birthday(integer) 0127.0.0.1:6379>

删除key

del key1 key2 ...

127.0.0.1:6379del  title(integer) 1127.0.0.1:6379keys *1) "sex"2) "name"127.0.0.1:6379> 127.0.0.1:6379del sex name(integer) 2127.0.0.1:6379keys *(empty list or set)127.0.0.1:6379>

改变key的名字

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:6379rename sex  ageOK127.0.0.1:6379get age"1"127.0.0.1:6379>

请注意,age原来是24.现在是1.

使用renamenx安全的替换key:

127.0.0.1:6379set name  jerryOK127.0.0.1:6379set age 24OK127.0.0.1:6379set sex 1OK

127.0.0.1:6379> renamenx sex age

如果修改成功,将返回1,修改失败(不作任何操作)将返回0

redis的数据库

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:6379select 23(errorERR invalid DB index127.0.0.1:6379>

move:将key移动到别的数据库

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:6379select 1OK127.0.0.1:6379[1]keys *1) "sex"127.0.0.1:6379[1]>

expire设置有效期

memcache有有效期,即使设置为永不失效,也只能保存30天。redis本身是当做存储的,所以没有有效期,即永远不失效。

1.ttl查询有效期,默认返回秒单位计时

127.0.0.1:6379keys *1) "nickname"2) "age"127.0.0.1:6379ttl age(integer-1127.0.0.1:6379

返回-1表示永久有效

如果查询一个不在的key的生命周期,将会返回-2(2.8以后)

127.0.0.1:6379ttl gender(integer-2

2.expire设置有效期,是用秒作为单位的。

127.0.0.1:6379expire age 10(integer) 1127.0.0.1:6379get age"24"127.0.0.1:6379get age"24"127.0.0.1:6379get age(nil)127.0.0.1:6379>

3.pttl和pexpire:使用毫秒作为声明周期

127.0.0.1:6379pttl age(integer-1127.0.0.1:6379pexpire age 100000(integer) 1127.0.0.1:6379pttl age(integer) 97177127.0.0.1:6379pttl age(integer) 94561127.0.0.1:6379pttl age(integer) 93000127.0.0.1:6379pttl age(integer) 91937127.0.0.1:6379>

persist:让 key重新永久有效

127.0.0.1:6379set age 24OK127.0.0.1:6379expire age 20(integer) 1127.0.0.1:6379ttl age(integer) 14127.0.0.1:6379>  persist age(integer) 1127.0.0.1:6379ttl age(integer-1127.0.0.1:6379>

set命令:重复设置key怎么办

对相同的key多次设置值,会直接覆盖:

127.0.0.1:6379flushdbOK127.0.0.1:6379keys *(empty list or set)127.0.0.1:6379>  set  name  jerryOK127.0.0.1:6379set name   herryOK127.0.0.1:6379get name"herry"127.0.0.1:6379>

使用set keyname value nx来保证如果已经有这个key就不做任何操作,防止key被覆盖:

127.0.0.1:6379set site www.baodu.comOK127.0.0.1:6379set site www.taobao.com  nx(nil)127.0.0.1:6379get site"www.baodu.com"127.0.0.1:6379>

此外还有一个xx选项。

append :追加

setrange 与 getrange

getset:先得到旧的值,再设置新值

127.0.0.1:6379set  status  sleepOK127.0.0.1:6379getset status work"sleep"127.0.0.1:6379get status"work"127.0.0.1:6379>

加一与减一:

incr 与 decr

127.0.0.1:6379set  age 20OK127.0.0.1:6379incr age(integer) 21127.0.0.1:6379get age"21"127.0.0.1:6379decr age(integer) 20127.0.0.1:6379>

如果是一个字符串呢?

127.0.0.1:6379incr  status(errorERR value is not an integer or out of range127.0.0.1:6379>

redis:秒杀系统的设计与实践

一次增加或减少指定的数字

127.0.0.1:6379incrby  age 5(integer) 25127.0.0.1:6379>

一次增加或减少指定的浮点型数字

127.0.0.1:6379incrbyfloat  age 0.6"25.6"

位操作

位操作就是在 0和1 位上来操作。

127.0.0.1:6379set char AOK127.0.0.1:6379setbit char 2 1(integer) 0127.0.0.1:6379get 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:6379set name "你好"OK127.0.0.1:6379get name"\xe4\xbd\xa0\xe5\xa5\xbd"127.0.0.1:6379setbit name 5 0(integer) 1127.0.0.1:6379get 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。

bitop:位操作

假设有这样一个需求,要将大写的字符始终转换成小写的字符,可以使用bittop来操作。

由于小写字母的整数值始终比大写字母多32,可以使用OR操作来直接位运算:

127.0.0.1:6379flushdbOK127.0.0.1:6379setbit lower 2 1(integer) 0127.0.0.1:6379set char QOK127.0.0.1:6379bitop or char  char lower(integer) 1127.0.0.1:6379get 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>

从左边插入自然是倒着的。

lpop与rpop:从链表左端或者链表右端弹出值

删除指定的值

Redis Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。

COUNT 的值可以是以下几种:

  • count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
  • count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
  • count = 0 : 移除表中所有与 VALUE 相等的值。
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