## 21.13-22.15 Redis常用操作
### string 、list类型数据操作
* string
```
[root@adailinux ~]# redis-cli
127.0.0.1:6379> set key1 adai
OK
127.0.0.1:6379> set key1 linux
OK
127.0.0.1:6379> get key1
"linux"
#使用set添加数据,新值会替代旧值
127.0.0.1:6379> setnx key1 aaa
(integer) 0
127.0.0.1:6379> setnx key3 aaa
(integer) 1
127.0.0.1:6379> get key3
"aaa"
#使用setnx添加数据时,会检测数据是否存在
#0表示该值已经存在;1表示该值不存在,并添加到数据库中
127.0.0.1:6379> set key3 aaa ex 10
OK
127.0.0.1:6379> get key3
(nil)
#ex:=expire,设定数据的过期时间
#10s后key3消失
127.0.0.1:6379> setex key 60 aaa
OK
#设定数据保存时长,如果数据已经存在,则会重新赋值
```
* list
```
127.0.0.1:6379> lpush list2 aaa
(integer) 1
127.0.0.1:6379> lpush list2 bbb
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
1) "bbb"
2) "aaa"
127.0.0.1:6379> lpop list2
"bbb"
#先添加的数据排在下面
#lpop取值时先取上面的值
#lpop=left pop :从左侧取一个数据
127.0.0.1:6379> lrange list2 0 -1
1) "ddd"
2) "ccc"
3) "aaa"
127.0.0.1:6379> rpop list2
"aaa"
#rpop=right pop:从右侧取一个数据
#rpop取值时从下面开始取
**注意:** 使用l/rpop取值后,数据库中相应的值会消失
插入数据:
127.0.0.1:6379> linsert list2 after ccc 333
(integer) 3
127.0.0.1:6379> lrange list2 0 -1
1) "ddd"
2) "ccc"
3) "333"
#在“ccc”后面插入数据“333”
更改数据:
127.0.0.1:6379> lset list2 1 222
OK
127.0.0.1:6379> lrange list2 0 -1
1) "ddd"
2) "222"
3) "333"
查看某条数据:
127.0.0.1:6379> lindex list2 0
"ddd"
查看某列表中数据条数:
127.0.0.1:6379> llen list2
(integer) 3
#llen=list length
```
### Redis中关于集合的操作
```
在集合中添加数据:
127.0.0.1:6379> sadd set1 aaa bbb ccc
(integer) 3
查看集合汇总所有数据:
127.0.0.1:6379> SMEMBERS set1
1) "aaa"
2) "a"
3) "bbb"
4) "b"
5) "ccc"
删除指定素:
127.0.0.1:6379> srem set1 a b
(integer) 2
127.0.0.1:6379> SMEMBERS set1
1) "aaa"
2) "bbb"
3) "ccc"
随机取出两个元素:
127.0.0.1:6379> spop set1 2
1) "bbb"
2) "aaa"
127.0.0.1:6379> SMEMBERS set1
1) "ccc"
#spop set1后面不跟参数的话会随机取出一个值
注意:数据取出后,该数据将会在该集合中被删除
取差集:
127.0.0.1:6379> SMEMBERS set1
1) "aaa"
2) "mmm"
3) "ddd"
4) "bbb"
5) "ccc"
127.0.0.1:6379> SMEMBERS set2
1) "a"
2) "b"
3) "d"
4) "aaa"
5) "eee"
6) "ddd"
7) "ccc"
8) "bbb"
9) "fff"
127.0.0.1:6379> sdiff set1 set2
1) "mmm"
127.0.0.1:6379> sdiff set2 set1
1) "d"
2) "a"
3) "eee"
4) "b"
5) "fff"
注意:
取差集的规则--把哪个集合放在前面就以哪个集合为标准
即,只输出前面集合中不同元素
将差集存储到新的集合:
127.0.0.1:6379> sdiffstore set3 set2 set1
(integer) 5
127.0.0.1:6379> SMEMBERS set3
1) "d"
2) "a"
3) "eee"
4) "b"
5) "fff"
#set3:存储位置;set2和set1为取差集的两个集合
取交集:
127.0.0.1:6379> sinter set1 set2
1) "aaa"
2) "ddd"
3) "bbb"
4) "ccc"
存储交集:
127.0.0.1:6379> sinterstore set4 set1 set2
(integer) 4
127.0.0.1:6379> SMEMBERS set4
1) "aaa"
2) "ccc"
3) "bbb"
4) "ddd"
#set4为存储位置
取并集:
127.0.0.1:6379> sunion set1 set2
1) "eee"
2) "ddd"
3) "bbb"
4) "ccc"
5) "b"
6) "aaa"
7) "d"
8) "mmm"
9) "a"
10) "fff"
存储并集:
127.0.0.1:6379> sunionstore set5 set1 set2
(integer) 10
127.0.0.1:6379> SMEMBERS set5
1) "eee"
2) "ddd"
3) "bbb"
4) "ccc"
5) "b"
6) "aaa"
7) "d"
8) "mmm"
9) "a"
10) "fff"
判断一个元素是否属于某集合:
127.0.0.1:6379> sismember set1 a
(integer) 0
127.0.0.1:6379> sismember set1 aaa
(integer) 1
从某集合随机取指定数量的元素,但不删除:
127.0.0.1:6379> srandmember set1 3
1) "ddd"
2) "bbb"
3) "ccc"
127.0.0.1:6379> SMEMBERS set1
1) "aaa"
2) "mmm"
3) "ddd"
4) "bbb"
5) "ccc"
```
### 有序集合
```
创建有序集合:
127.0.0.1:6379> zadd zseta 11 123
(integer) 1
127.0.0.1:6379> zadd zseta 5 456
(integer) 1
#“11”和“5”分别为元素“123”和“456”的score,系统根据score对元素进行排序
查看:
127.0.0.1:6379> zrange zseta 0 -1
1) "456"
2) "123"
删除指定元素:
127.0.0.1:6379> zrem zseta 123
(integer) 1
127.0.0.1:6379> zrange zseta 0 -1
1) "456"
查看元素:
127.0.0.1:6379> zrange zseta 0 -1
1) "aaa"
2) "bbb"
3) "456"
4) "ccc"
127.0.0.1:6379> zrange zseta 0 -1 withscores
1) "aaa"
2) "2"
3) "bbb"
4) "3"
5) "456"
6) "5"
7) "ccc"
8) "8"
#withscores:同时显示各元素对应的score
查看元素的索引值(即,第几个元素,从0开始计数):
127.0.0.1:6379> zrank zseta ccc
(integer) 3
同上,不同的是该索引值是按元素的score进行排序的:
127.0.0.1:6379> zrevrank zseta aaa
(integer) 3
127.0.0.1:6379> zrevrank zseta ccc
(integer) 0
反序显示所有元素:
127.0.0.1:6379> zrevrange zseta 0 -1
1) "ccc"
2) "456"
3) "bbb"
4) "aaa"
127.0.0.1:6379> zrevrange zseta 0 -1 withscores
1) "ccc"
2) "8"
3) "456"
4) "5"
5) "bbb"
6) "3"
7) "aaa"
8) "2"
查看集合中元素个数:
127.0.0.1:6379> zcard zseta
(integer) 4
查看某分值范围内的元素个数:
127.0.0.1:6379> zcount zseta 1 10
(integer) 4
127.0.0.1:6379> zcount zseta 1 5
查看某分值范围内的元素及分值:
127.0.0.1:6379> zrangebyscore zseta 1 5
1) "aaa"
2) "bbb"
3) "456"
127.0.0.1:6379> zrangebyscore zseta 1 5 withscores
1) "aaa"
2) "2"
3) "bbb"
4) "3"
5) "456"
6) "5"
删除指定索引范围的元素:
127.0.0.1:6379> zrange zseta 0 -1
1) "aaa"
2) "bbb"
3) "456"
4) "ccc"
127.0.0.1:6379> zremrangebyrank zseta 0 1
(integer) 2
127.0.0.1:6379> zrange zseta 0 -1
1) "456"
2) "ccc"
删除指定分值范围内的元素:
127.0.0.1:6379> zremrangebyscore zseta 1 5
(integer) 1
127.0.0.1:6379> zrange zseta 0 -1
1) "ccc"
```
### hash类型数据的操作
```
添加数据:
127.0.0.1:6379> hset hseta a 1
(integer) 1
批量添加数据:
127.0.0.1:6379> hmset hseta b 2 c 3 d 4
OK
查看指定数据的值:
127.0.0.1:6379> hget hseta b
"2"
批量查看指定数据的值:
127.0.0.1:6379> hmget hseta b c
1) "2"
2) "3"
查看所有数据:
127.0.0.1:6379> HGETALL hseta
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "d"
8) "4"
删除指定数据:
127.0.0.1:6379> hdel hseta b c
(integer) 2
127.0.0.1:6379> HGETALL hseta
1) "a"
2) "1"
3) "d"
4) "4"
打印所有的key:
127.0.0.1:6379> hkeys hseta
1) "a"
2) "d"
打印所有的value:
127.0.0.1:6379> hvals hseta
1) "1"
2) "4"
查看有几个filed:
127.0.0.1:6379> hlen hseta
(integer) 2
```
## 21.16 Redis操作--键值
```
查看数据库内所有key:
127.0.0.1:6379> keys *
1) "hseta"
2) "k3"
3) "setb"
4) "hash1"
5) "zseta"
6) "mykey"
7) "set3"
8) "key2"
9) "set2"
10) "set4"
11) "key1"
12) "list2"
13) "k1"
14) "seta"
15) "list1"
16) "k2"
17) "set1"
18) "set5"
支持模糊匹配:
127.0.0.1:6379> keys set*
1) "setb"
2) "set3"
3) "set2"
4) "set4"
5) "seta"
6) "set1"
7) "set5"
查看某key是否存在:
127.0.0.1:6379> exists key1
(integer) 1
127.0.0.1:6379> exists key11
(integer) 0
#0:表示不存在;1:表示存在
删除key:
127.0.0.1:6379> del key1
(integer) 1
127.0.0.1:6379> exists key1
(integer) 0
给已存在的key设置过期时间:
127.0.0.1:6379> EXPIRE key2 600
查看某key还有多长时间过期:
127.0.0.1:6379> ttl key2
(integer) 578
#当key已经不存在时,返回-2
#当key存在但是没有设置失效时间时,返回-1
选择数据库:
127.0.0.1:6379> select 0
OK
#Redis有16个库,0表示当前所在的库
将一个 key移动到另一个库:
127.0.0.1:6379> move set2 1
(integer) 1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "set2"
取消某个key的过期时间(persist):
127.0.0.1:6379> ttl key2
(integer) 221
127.0.0.1:6379> persist key2
(integer) 1
127.0.0.1:6379> ttl key2
(integer) -1
随机返回一个key:
127.0.0.1:6379> randomkey
"zseta"
127.0.0.1:6379> randomkey
"mykey"
重命名:
127.0.0.1:6379> rename set2 set22
OK
127.0.0.1:6379> smembers set2
(empty list or set)
127.0.0.1:6379> smembers set22
1) "d"
2) "b"
3) "eee"
查看key的类型:
127.0.0.1:6379> type key2
string
127.0.0.1:6379> type set22
set
127.0.0.1:6379> type zseta
zset
127.0.0.1:6379> type list2
list
127.0.0.1:6379> type hseta
hash
查看数据库找那个key的数目:
127.0.0.1:6379> DBSIZE
(integer) 17
查看数据库的状态信息:
127.0.0.1:6379> info
清空当前数据库内所有key:
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "set22"
127.0.0.1:6379[1]> flushdb
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
清空所有数据库内所有的key:
127.0.0.1:6379> flushall
保存数据到rdb文件中,在后台运行:
127.0.0.1:6379> bgsav
同上,在前台运行:
127.0.0.1:6379> save
获取所有配置参数:
127.0.0.1:6379> config get *
查看指定参数:
127.0.0.1:6379> config get port
1) "port"
2) "6379"
设置某参数:
27.0.0.1:6379> config set timeout 100
```
### 数据恢复
首先定义或确定dir目录和dbfilename,然后把备份的rdb文件放到dir目录下面,重启Redis即可恢复数据。
## 21.17 Redis安全设置
### 设置IP和端口:
```
设置监听的IP:
bind 127.0.0.1 2.2.2.2
#监听指定IP可提高安全性,多个IP用空格分开
设置端口:
port 7000
#不使用Redis默认端口(6379)
```
### 设置密码:
```
[root@adailinux ~]# vim /etc/redis.conf
requirepass 123456
重启Redis:
[root@adailinux ~]# killall redis-server
[root@adailinux ~]# redis-server /etc/redis.conf
登录:
[root@adailinux ~]# redis-cli -a '123456'
```
### 更改config的名字或禁掉config命令:
```
[root@adailinux ~]# vim /etc/redis.conf
rename-command CONFIG adai
#将“config”命令改为“adai”
rename-command CONFIG ""
即,把config的名字改为空
```
编辑回复