linux 学习笔记-079-NoSQL-redis 常用操作,redis 操作键值,redis 安全设置

发布于 2018-05-03  124 次阅读


redis 常用操作(五种数据类型)

01

第二次赋值会把第一次的赋值覆盖

127.0.0.1:6379> set key1 am

OK

127.0.0.1:6379> get key1

"am"

127.0.0.1:6379> set key1 am1

OK

127.0.0.1:6379> get key1

"am1"

02

如果 key4 不存在,则返回 1 并创建 key4,如果存在则返回 0,并不做更改

127.0.0.1:6379> SETNX key4 aaa

(integer) 1

127.0.0.1:6379> SETNX key4 bbb

(integer) 0

127.0.0.1:6379> get key4

"aaa"

03

创建一个 key,名称为 key3,值为 1,过期时间为 10 秒

127.0.0.1:6379> SETEX key3 10 1

OK

127.0.0.1:6379> get key3

"1"

127.0.0.1:6379> get key3

(nil)

04

LPUSH 创建链表并把元素放进去,LRANGE 可以列出列表的元素(默认后放入的元素排第一位),LPOP 取出元素(默认取出排第一位的元素,取出之后,链表会减少相应元素),RPUSH 给链表放入元素(默认放到原有元素的最后),RPOP 取出列表的元素(默认取出排在最后的元素)

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"

127.0.0.1:6379> RPUSH list2 1

(integer) 2

127.0.0.1:6379> LRANGE list2 0 -1

1) "aaa"

2) "1"

127.0.0.1:6379> RPOP list2

"1"

05

插入元素,before 表示在 aaa 的前面插入 123,after 表示在 aaa 后面插入 123

127.0.0.1:6379> LRANGE list2 0 -1

1) "aaa"

127.0.0.1:6379> LINSERT list2 before aaa 123

(integer) 2

127.0.0.1:6379> LRANGE list2 0 -1

1) "123"

2) "aaa"

127.0.0.1:6379> LINSERT list2 after aaa 123

(integer) 3

127.0.0.1:6379> LRANGE list2 0 -1

1) "123"

2) "aaa"

3) "123"

06

修改元素,LSET 用来修改指定位置的元素,注意,元素顺序从 0 开始算起

127.0.0.1:6379> LSET list2 0 321

OK

127.0.0.1:6379> LRANGE list2 0 -1

1) "321"

2) "aaa"

3) "123"

127.0.0.1:6379> LSET list2 2 bbb

OK

127.0.0.1:6379> LRANGE list2 0 -1

1) "321"

2) "aaa"

3) "bbb"

07

查看元素,注意,元素顺序从 0 开始算起

127.0.0.1:6379> LRANGE list2 0 -1

1) "321"

2) "aaa"

3) "bbb"

127.0.0.1:6379> LINDEX list2 0

"321"

127.0.0.1:6379> LINDEX list2 1

"aaa"

08

查看链表共有多少个元素

127.0.0.1:6379> LLEN list2

(integer) 3

09

创建集合 am,添加 aaa 和 bbb 元素,SMEMBERS 查询集合中的元素,SREM 删除集合中的指定元素,SPOP 随机抽取一个元素并删除

127.0.0.1:6379> SADD am aaa

(integer) 1

127.0.0.1:6379> SADD am bbb

(integer) 1

127.0.0.1:6379> SMEMBERS am

1) "bbb"

2) "aaa"

127.0.0.1:6379> SREM am aaa

(integer) 1

127.0.0.1:6379> SMEMBERS am

1) "bbb"

127.0.0.1:6379> SPOP am

"bbb"

127.0.0.1:6379> SMEMBERS am

(empty list or set)

10

SDIFF 求差集,以在前面的集合为标准

127.0.0.1:6379> SADD am 123

(integer) 1

127.0.0.1:6379> SADD am 321

(integer) 1

127.0.0.1:6379> SADD am 987

(integer) 1

127.0.0.1:6379> SADD ma 456

(integer) 1

127.0.0.1:6379> SADD ma 654

(integer) 1

127.0.0.1:6379> SADD ma 123

(integer) 1

127.0.0.1:6379> SMEMBERS am

1) "123"

2) "321"

3) "987"

127.0.0.1:6379> SMEMBERS ma

1) "123"

2) "456"

3) "654"

127.0.0.1:6379> SDIFF am ma

1) "321"

2) "987"

127.0.0.1:6379> SDIFF ma am

1) "456"

2) "654"

11

求差集的时候把值赋予 mm 集合

127.0.0.1:6379> SDIFFSTORE mm am ma

(integer) 2

127.0.0.1:6379> SMEMBERS mm

1) "321"

2) "987"

12

求交集的时候把值赋予 mm 集合

127.0.0.1:6379> SINTER am ma

1) "123"

127.0.0.1:6379> SINTERSTORE mm am ma

(integer) 1

127.0.0.1:6379> SMEMBERS mm

1) "123"

13

求并集的时候把值赋予 mm 集合

127.0.0.1:6379> SUNION am ma

1) "123"

2) "321"

3) "456"

4) "654"

5) "987"

127.0.0.1:6379> SUNIONSTORE mm am ma

(integer) 5

127.0.0.1:6379> SMEMBERS mm

1) "123"

2) "321"

3) "456"

4) "654"

5) "987"

14

SISMEMBER 判断一个元素是否属于一个集合,是则返回 1,否则返回 0

127.0.0.1:6379> SMEMBERS am

1) "123"

2) "321"

3) "987"

127.0.0.1:6379> SISMEMBER am 123

(integer) 1

127.0.0.1:6379> SISMEMBER am 2

(integer) 0

15

SRANDMEMBER 随机取出一个或多个元素,但不删除

127.0.0.1:6379> SRANDMEMBER am

"123"

127.0.0.1:6379> SRANDMEMBER am 2

1) "321"

2) "987"

127.0.0.1:6379> SMEMBERS am

1) "123"

2) "321"

3) "987"

16

ZADD 创建有序集合,ZRANGE 查询有序集合的元素

127.0.0.1:6379> ZADD zam 11 123

(integer) 1

127.0.0.1:6379> ZADD zam 1 abc

(integer) 1

127.0.0.1:6379> ZRANGE zam 0 -1

1) "abc"

2) "123"

17

删除有序集合中的指定元素

127.0.0.1:6379> ZREM zam 123

(integer) 1

127.0.0.1:6379> ZRANGE zam 0 -1

1) "abc"

18

ZRANK 查询元素的索引值,按 score 正向排序(如"ZADD zam 0 25",这里的 0 就是 score)

127.0.0.1:6379> ZADD zam 0 25

(integer) 1

127.0.0.1:6379> ZADD zam 2 55

(integer) 1

127.0.0.1:6379> ZADD zam 8 159

(integer) 1

127.0.0.1:6379> ZRANGE zam 0 -1

1) "25"

2) "abc"

3) "55"

4) "159"

127.0.0.1:6379> ZRANK zam abc

(integer) 1

127.0.0.1:6379> ZRANK zam 159

(integer) 3

19

ZREVRANK 查询元素的索引值,按 score 反向排序

127.0.0.1:6379> ZRANGE zam 0 -1

1) "25"

2) "abc"

3) "55"

4) "159"

127.0.0.1:6379> ZREVRANK zam abc

(integer) 2

127.0.0.1:6379> ZREVRANK zam 159

(integer) 0

20

ZREVRANGE 反序显示所有元素,并带分值;ZCARD 返回集合中所有元素的个数

127.0.0.1:6379> ZREVRANGE zam 0 -1

1) "159"

2) "55"

3) "abc"

4) "25"

127.0.0.1:6379> ZCARD zam

(integer) 4

21

ZCOUNT 返回分值范围 1-10 的元素个数;ZRANGEBYSCORE 返回分值范围 1-10 的元素

127.0.0.1:6379> ZCOUNT zam 1 10

(integer) 3

127.0.0.1:6379> ZRANGEBYSCORE zam 1 10

1) "abc"

2) "55"

3) "159"

22

ZREMRANGEBYRANK 删除索引指定的元素,按 score 正向排序;ZREMRANGEBYSCORE 删除分值范围 1-10 的元素

127.0.0.1:6379> ZRANGE zam 0 -1

1) "25"

2) "abc"

3) "55"

4) "159"

127.0.0.1:6379> ZREMRANGEBYRANK zam 0 1

(integer) 2

127.0.0.1:6379> ZREMRANGEBYSCORE zam 1 10

(integer) 2

127.0.0.1:6379> ZREVRANGE zam 0 -1

(empty list or set)

23

HMSET 批量建立键值对

127.0.0.1:6379> HMSET ham a 7 b 8 c 9

OK

127.0.0.1:6379> HGETALL ham

1) "a"

2) "7"

3) "b"

4) "8"

5) "c"

6) "9"

24

HMGET 获取一个或多个键值

127.0.0.1:6379> HMGET ham c

1) "9"

127.0.0.1:6379> HMGET ham b c

1) "8"

2) "9"

25

HDEL 删除指定 filed;HKEYS 查询所有 key;HVALS 查询所有的值;HLEN 查看有几个 filed

127.0.0.1:6379> HDEL ham c

(integer) 1

127.0.0.1:6379> HGETALL ham

1) "a"

2) "7"

3) "b"

4) "8"

127.0.0.1:6379> HKEYS ham

1) "a"

2) "b"

127.0.0.1:6379> HVALS ham

1) "7"

2) "8"

127.0.0.1:6379> HLEN ham

(integer) 2

redis 常用操作(键值)

01

取出所有键

127.0.0.1:6379> keys *

 1) "key4"

 2) "mm"

 3) "hash1"

 4) "key1"

 5) "mykey"

 6) "list2"

 7) "list1"

 8) "am"

 9) "ma"

10) "set3"

11) "ham"

12) "set1"

13) "set2"

14) "key2"

02

模糊匹配 k 开头的 key

127.0.0.1:6379> KEYS k*

1) "key4"

2) "key1"

3) "key2"

03

EXISTS 查询 key 是否存在,存在返回 1,否则返回 0

127.0.0.1:6379> EXISTS key5

(integer) 0

127.0.0.1:6379> EXISTS key4

(integer) 1

04

del 删除一个 key,成功返回 1,失败返回 0

127.0.0.1:6379> del key4

(integer) 1

127.0.0.1:6379> del key4

(integer) 0

05

设置 key1 过期时间

127.0.0.1:6379> EXPIRE key1 10

(integer) 1

127.0.0.1:6379> get key1

"am1"

127.0.0.1:6379> get key1

(nil)

06

TTL 查询 key 的过期时间,返回-2 说明已经过期,返回-1 的话,说明没设置过期时间

127.0.0.1:6379> EXPIRE key1 10

(integer) 1

127.0.0.1:6379> TTL key1

(integer) 4

127.0.0.1:6379> TTL key1

(integer) 3

127.0.0.1:6379> TTL key1

(integer) 1

127.0.0.1:6379> TTL key1

(integer) -2

127.0.0.1:6379> get key1

(nil)

07

redis 有 16 个库,0-15,使用 select 可以切换库,默认使用的是 0 库

127.0.0.1:6379> SELECT 1

OK

127.0.0.1:6379[1]> KEYS *

(empty list or set)

08

MOVE 可以把指定 key 移动到指定库中

127.0.0.1:6379> KEYS *

 1) "hash1"

 2) "mykey"

 3) "list2"

 4) "list1"

 5) "am"

 6) "ma"

 7) "set3"

 8) "ham"

 9) "set1"

10) "set2"

11) "key2"

127.0.0.1:6379> MOVE key2 1

(integer) 1

127.0.0.1:6379> SELECT 1

OK

127.0.0.1:6379[1]> KEYS *

1) "key2"

09

PERSIST 清除 key 的过期时间

127.0.0.1:6379> SET mykey 54

OK

127.0.0.1:6379> EXPIRE mykey 1000

(integer) 1

127.0.0.1:6379> ttl mykey

(integer) 995

127.0.0.1:6379> PERSIST mykey

(integer) 1

127.0.0.1:6379> ttl mykey

(integer) -1

10

RANDOMKEY 随即返回一个 key

127.0.0.1:6379> RANDOMKEY

"am"

127.0.0.1:6379> RANDOMKEY

"set2"

127.0.0.1:6379> RANDOMKEY

"mykey"

11

RENAME 修改 key 名

127.0.0.1:6379> RENAME mykey ykey

OK

127.0.0.1:6379> KEYS *

 1) "hash1"

 2) "ykey"

 3) "list2"

 4) "list1"

 5) "am"

 6) "ma"

 7) "set3"

 8) "ham"

 9) "set1"

10) "set2"

12

TYPE 查询 key 的类型

127.0.0.1:6379> TYPE ykey

string

127.0.0.1:6379> TYPE am

set

127.0.0.1:6379> TYPE ham

hash

redis 常用操作(服务)

01

返回当前数据库中 key 的数目

127.0.0.1:6379> DBSIZE

(integer) 10

02

返回 redis 数据库状态信息

127.0.0.1:6379> INFO

# Server

redis_version:4.0.9

redis_git_sha1:00000000

redis_git_dirty:0

redis_build_id:642e030c1e9fc2fd

redis_mode:standalone

………………省略部分输出信息………………

# Keyspace

db0:keys=10,expires=0,avg_ttl=0

db1:keys=1,expires=0,avg_ttl=0

03

清空所有数据库中的所有的 key

127.0.0.1:6379> SELECT 1

OK

127.0.0.1:6379[1]> KEYS *

1) "key2"

127.0.0.1:6379[1]> FLUSHALL

OK

127.0.0.1:6379[1]> KEYS *

(empty list or set)

04

清空当前数据库中的 key

127.0.0.1:6379[1]> FLUSHDB

OK

127.0.0.1:6379[1]> KEYS *

(empty list or set)

05

保存数据到 rdb 文件中,在后台运行

127.0.0.1:6379[1]> BGSAVE

Background saving started

06

保存数据到 rdb 文件中,在前台运行

127.0.0.1:6379[1]> SAVE

OK

07

获取所有配置参数

127.0.0.1:6379[1]> config get *

  1) "dbfilename"

  2) "dump.rdb"

  ………………省略部分输出信息………………

175) "notify-keyspace-events"

176) ""

177) "bind"

178) "127.0.0.1"

08

获取配置参数

127.0.0.1:6379[1]> CONFIG GET dbfilename

1) "dbfilename"

2) "dump.rdb"

09

修改配置参数

127.0.0.1:6379[1]> CONFIG SET timeout 100

OK

127.0.0.1:6379[1]> CONFIG GET timeout

1) "timeout"

2) "100"

10

数据恢复: 首先定义或者确定 dir 目录和 dbfilename,然后把备份的 rdb 文件放到 dir 目录下面,重启 redis 服务即可恢复数据,这是需要知道 dir 目录和 dbfilename

redis 安全设置

redis 服务启动后,如果监听了全网 IP,服务器也没做 iptables 规则,那么黑客就能直接连接 redis,并通过修改 redis 的配置,设置 dir 目录和 dbfilename,dir 目录设定到/root/.ssh/,dbfilename 设置为 authorized_keys,这个文件是一个用来存放公钥的文件,这时黑客就能在这里存一个值(values),而这个值就是一个公钥,这时黑客就能直接通过这个公钥来连接服务器,取得管理员权限了

这个问题的解决方法也不难,只需要设置密码,设置内网 IP,增加防火墙规则,以普通用户身份启动 redis 等

01

设置监听 ip,可以是多个 ip,用空格分隔

bind 127.0.0.1  2.2.2.2

02

设置监听端口

port 16000

03

设置密码,配置文件中增加配置,这时不使用密码登录,是不能做任何操作的

[root@am-01:~#] vim /etc/redis.conf

requirepass itsupport.0

[root@am-01:~#] killall redis-server

[root@am-01:~#] redis-server /etc/redis.conf

[root@am-01:~#] redis-cli

127.0.0.1:6379> KEYS *

(error) NOAUTH Authentication required.

127.0.0.1:6379>

[root@am-01:~#] redis-cli -a itsupport.0

127.0.0.1:6379> KEYS *

(empty list or set)

04

修改 config 命令名字,这里把 config 命令名称改为 it

[root@am-01:~#] vim /etc/redis.conf

rename-command CONFIG it

[root@am-01:~#] killall redis-server

[root@am-01:~#] redis-server /etc/redis.conf

[root@am-01:~#] redis-cli -a itsupport.0

127.0.0.1:6379> CONFIG get dir

(error) ERR unknown command 'CONFIG'

127.0.0.1:6379> it get dir

1) "dir"

2) "/data/redis"

05

禁止 config 命令,这时,config 命令就不能使用了

[root@am-01:~#] vim /etc/redis.conf

rename-command CONFIG ""

[root@am-01:~#] killall redis-server

[root@am-01:~#] redis-server /etc/redis.conf

[root@am-01:~#] redis-cli -a itsupport.0

127.0.0.1:6379> CONFIG GET dir

(error) ERR unknown command 'CONFIG'

127.0.0.1:6379> it get dir

(error) ERR unknown command 'it'