Redis 之 (2) 常用操作、操作键值、安全设置

13. redis常用操作

1 Redis常用操作 for String数据

  • SETNX 检测键值是否有value,如果有直接返回一个 0,如果没有直接返回一个 1 并且创建此 value。(string)
如果一个key设置两个不同的值,第二个值会覆盖第一个值。
# redis-cli 
127.0.0.1:6379> set key1 yun
OK
127.0.0.1:6379> set key2 tai
OK
127.0.0.1:6379> set key1 awkk
OK
127.0.0.1:6379> get key1
"awkk"

使用setnx命令检测
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 key1
"awkk"
127.0.0.1:6379> get key3
"aaa"
  • setex 针对某个key设置一个过期时间。(string)
setex key3 10 1            //给key3设置过期时间为10s,值为1,若key已经存在,会覆盖新的值。

2 Redis常用操作 for List数据

  • LPUSH 插入值、LPOP 取(挤)出值、lrange 列出值(范围)
127.0.0.1:6379> LPUSH kk 222     //从左侧添加一个数据,相当于从瓶子上方往里面放饼干,先存的在里面,后存的在外边
(integer) 1
127.0.0.1:6379> LPUSH kk 111
(integer) 1
127.0.0.1:6379> LPUSH kk 2222    
(integer) 3
127.0.0.1:6379> LRANGE kk 0 -1     
1) "2222"
2) "111"
3) "222"
127.0.0.1:6379> LPOP kk       //LPOP 取最上面的值
"2222"
127.0.0.1:6379> RPOP kk       //RPOP 取最下面的值
"222"
# 注意:RPOP 或者 LPOP只要把值取出来 其中的值就会被删除掉。
  • Linsert 插入一个值 before在前面/after在后面
127.0.0.1:6379> LRANGE kk1 0 -1
1) "333"
2) "asd"
3) "111"
在之前插入一个数值:
127.0.0.1:6379> LINSERT kk1 before 333 zzz
(integer) 4
127.0.0.1:6379> LRANGE kk1 0 -1
1) "zzz"
2) "333"
3) "asd"
4) "111"
在之后插入一个数值:
127.0.0.1:6379> LINSERT kk1 after asd sss
(integer) 5
127.0.0.1:6379> LRANGE kk1 0 -1
1) "zzz"
2) "333"
3) "asd"
4) "sss"
5) "111"
  • LSET 修改一个值
127.0.0.1:6379> LRANGE kk1 0 -1
1) "zzz"
2) "333"
3) "asd"
4) "sss"
5) "111"
127.0.0.1:6379> LSET kk1 1 555    //把第二个值 333 改为 555(首个数值是从0 开始的)
OK
127.0.0.1:6379> LRANGE kk1 0 -1
1) "zzz"
2) "555"
3) "asd"
4) "sss"
5) "111"
  • LINDEX 查看元素的值
lindex kk1 0 //查看第1个元素
lindex kk1 3 //查看第4个元素
  • LLEN 查看元素的长度
127.0.0.1:6379> LLEN kk1
(integer) 5
表示有5个元素

3 Redis常用操作 for Set(zset)数据

127.0.0.1:6379> SADD pp 111   //向集合pp中放入元素
(integer) 1
127.0.0.1:6379> SADD pp 222
(integer) 1
127.0.0.1:6379> SADD pp 333
(integer) 1
127.0.0.1:6379> SMEMBERS pp   //查看集合中的所有元素
1) "111"
2) "222"
3) "333"
127.0.0.1:6379> SPOP pp   //随机取出一个元素,删除
"111"
127.0.0.1:6379> SMEMBERS pp
1) "111"
2) "222"
3) "333"
127.0.0.1:6379> SREM pp 111   //删除一个元素
(integer) 1
127.0.0.1:6379> SMEMBERS pp
1) "222"
2) "333"
  • SDIFF 求差集
127.0.0.1:6379> SMEMBERS pp
1) "222"
2) "333"
127.0.0.1:6379> SMEMBERS mm
1) "221"
2) "222"
3) "233"
127.0.0.1:6379> SDIFF pp mm
1) "333"
127.0.0.1:6379> SDIFF mm pp
1) "221"
2) "233"
第一个SDIFF pp在前 mm在后 意思是针对于pp 对照mm找出不同的值
第一个SDIFF mm在前 pp在后 意思是针对于mm 对照pp找出不同的值
127.0.0.1:6379> SDIFFstore nn mm pp //求差集并且存储,存储到了nn里
(integer) 2
127.0.0.1:6379> SMEMBERS nn
1) "221"
2) "233"
  • SINTER 求交集
127.0.0.1:6379> SMEMBERS pp
1) "222"
2) "333"
127.0.0.1:6379> SMEMBERS mm
1) "221"
2) "222"
3) "233"
127.0.0.1:6379> SINTER mm pp
1) "222"
127.0.0.1:6379> SINTERSTORE aa mm pp //求交集并且存储,存储到了aa里
(integer) 1
127.0.0.1:6379> SMEMBERS aa
1) "222"
  • SISMEMBER 判断集合中是否有此值
127.0.0.1:6379> SMEMBERS mm
1) "221"
2) "222"
3) "233"
127.0.0.1:6379> SISMEMBER mm 11
(integer) 0
127.0.0.1:6379> SISMEMBER mm 233
(integer) 1
  • ZADD 创建有序集合
127.0.0.1:6379> ZADD ss 1 123
(integer) 1
127.0.0.1:6379> ZADD ss 2 234
(integer) 1
127.0.0.1:6379> ZADD ss 3 asd
(integer) 1
127.0.0.1:6379> ZRANGE ss 0 -1 //显示所有元素,按顺序显示
1) "123"
2) "234"
3) "asd"
127.0.0.1:6379> ZREM ss 234 //删除指定元素
(integer) 1
127.0.0.1:6379> ZRANGE ss 0 -1
1) "123"
2) "asd"
  • ZRANK 索引数据
127.0.0.1:6379> ZRANGE ss 0 -1
1) "123"
2) "asd"
3) "asdaqwe"
4) "asasdz"
127.0.0.1:6379> ZRANK ss asd //返回元素的索引值,索引值从0开始,按score正向排序
(integer) 1
127.0.0.1:6379> ZRANK ss asasdz
(integer) 3
127.0.0.1:6379> ZREVRANK ss asd //按score反向排序,获取数据的值
(integer) 2
  • ZCARD 统计集合元素中的个数
127.0.0.1:6379> ZCARD ss
(integer) 4
  • ZCOUNT 统计范围内集合元素的个数
127.0.0.1:6379> ZCOUNT ss 1 10 //返回分值范围1-10的元素个数
(integer) 2
  • ZRANGEBYSCORE 返回分值范围的元素
127.0.0.1:6379> ZRANGEBYSCORE ss 1 10
1) "123"
2) "asd"
  • ZREMRANGEBYSCORE 删除分值范围的元素
127.0.0.1:6379> ZREMRANGEBYSCORE ss 1 10
(integer) 2
127.0.0.1:6379> ZRANGE ss 0 -1
1) "asdaqwe"
2) "asasdz"
  • ZREMRANGEBYRANK 删除索引范围的元素,按score正向排序
127.0.0.1:6379> ZRANGE ss 0 -1
1) "asdaqwe"
2) "123"
3) "234"
4) "345"
5) "asdaa"
6) "asasdz"
127.0.0.1:6379> ZREMRANGEBYRANK ss 1 10
(integer) 5
127.0.0.1:6379> ZRANGE ss 0 -1
1) "asdaqwe"

4 Redis常用操作 for hash数据

  • HMSET 批量建立键值对
127.0.0.1:6379> HMSET yt name yuntai age 27 weight 77
OK
127.0.0.1:6379> HGETALL yt
1) "name"
2) "yuntai"
3) "age"
4) "27"
5) "weight"
6) "77"
  • HMGET 查询一个键值
127.0.0.1:6379> HMGET yt name
1) "yuntai"
  • HDEL 删除一个键值
127.0.0.1:6379> HDEL yt name
(integer) 1
127.0.0.1:6379> HGETALL yt
1) "age"
2) "27"
3) "weight"
4) "77"
  • HKEYS 打印所有的键值 HVALS 打印所有的values
127.0.0.1:6379> HKEYS yt
1) "age"
2) "weight"
127.0.0.1:6379> HVALS yt
1) "27"
2) "77"
  • hlen 查看有几个filed
127.0.0.1:6379> HLEN yt
(integer) 2

14. 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即可恢复数据。

15. redis安全设置

谈到安全,先说一个真实的例子:前两年Redis比较火的时候,也就是攻击最严重的时候。见到了很多次由Redis被黑导致系统被黑的案例! 怎么被黑的呢?

Redis 服务启动了,但是监听了一个全网IP,如果6379默认端口没有更改,并且iptables也处于关闭,公网IP 也开放着,Redis也没有设置任何密码,黑客就会扫描端口,然后就可以轻轻松松登录你的Redis服务器,并且是超级管理员的权限。然后黑客就可以设置dir dbname, dir 定义到/root/.ssh 且dbname定义为:.ssh/authorized_keys 再把这个值写上自己的公钥。 这些应该都不陌生吧,这不就活生生的把黑客的公钥上传到了咱们的服务器中,然后利用超级管理员做任何想做的事情了!! 当然解决也很简单:1.设置密码 2.更改默认端口 3.监听内网IP 4.设定专用账户 5.修改configure命令

vim /etc/redis.conf

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

设置监听端口
port 16000

设置密码
requirepass passwd123
redis-cli -a 'passwd123'

将config命令改名
rename-command CONFIG xxx

禁掉config命令
rename-command CONFIG “”

最后重启 redis 服务器

# killall redis-server
# redis-server /etc/redis.conf

再次登陆 redis server 我们发现需要密码

127.0.0.1:6379> SADD asd 12
(error) NOAUTH Authentication required.
[root@zhdy-01 ~]# redis-cli -a 'asd9577'
127.0.0.1:6379> SADD asd 12
(integer) 1

我们还可以使用如上所讲的 更改config 为自定义名称,就算黑客登录了你的redis服务器也不晓得你们的config是什么命令。

[root@yt-01 ~]# vim /etc/redis.conf
添加:rename-command CONFIG xxx
[root@yt-01 ~]# killall redis-server
[root@yt-01 ~]# redis-server /etc/redis.conf
127.0.0.1:6379> CONFIG GET *
(error) ERR unknown command 'CONFIG'
127.0.0.1:6379> xxx GET *
  1) "dbfilename"
  2) "dump.rdb"
  3) "requirepass"
  4) "xxx9577"
  5) "masterauth"
  6) ""
  7) "cluster-announce-ip"
  8) ""
  9) "unixsocket"

最后一个就是禁掉 CONFIG

vim /etc/redis.conf 

把 # rename-commond CONFIG " "去掉前面的注释

猜你喜欢

转载自my.oschina.net/zhouyuntai/blog/1791161