如果一个key设置两个不同的值,第二个值会覆盖第一个值。
127.0.0.1:6379> set key1 zhang
OK
127.0.0.1:6379> set key2 duan
OK
127.0.0.1:6379> set key1 asdqwe
OK
127.0.0.1:6379> get key1
"asdqwe"
SETNX 检测键值是否有value 如果有直接返回一个 0 如果没有直接返回一个 1 并且创建此 value
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
"asdqwe"
127.0.0.1:6379> get key3
"aaa"
setex 针对某个key设置一个过期时间。
setex key3 10 1 //给key3设置过期时间为10s,值为1,若key已经存在,会覆盖新的值。
LPUSH 取值
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只要把值取出来 其中的值就会被删除掉。
在某个数值的前面或者后面插入一个值
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"
修改其中的一个值(使用的是key 修改的是 value)
把第二个值 333 改为 555(首个数值是从0 开始的)
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 2 555
OK
127.0.0.1:6379> LRANGE kk1 0 -1
1) "zzz"
2) "333"
3) "555"
4) "sss"
5) "111"
LINDEX 查看元素的值
lindex kk1 0 //查看第1个元素
lindex kk1 3 //查看第4个元素
LLEN 查看元素的长度
127.0.0.1:6379> LLEN kk1
(integer) 5
表示有5个元素
SET 常用操作
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"
HMSET 批量建立键值对
127.0.0.1:6379> HMSET zh name justin age 27 jobs IT
OK
127.0.0.1:6379> HGETALL zh
1) "name"
2) "justin"
3) "age"
4) "27"
5) "jobs"
6) "IT"
HMGET 查询一个键值
127.0.0.1:6379> HMGET zh name
1) "justin"
HDEL 删除一个键值
127.0.0.1:6379> HDEL zh name
(integer) 1
127.0.0.1:6379> HGETALL zh
1) "age"
2) "27"
3) "jobs"
4) "IT"
HKEYS 打印所有的键值 HVALS 打印所有的values
127.0.0.1:6379> HKEYS zh
1) "age"
2) "jobs"
127.0.0.1:6379> HVALS zh
1) "27"
2) "IT"
hlen 查看有几个filed
127.0.0.1:6379> HLEN zh
(integer) 2
keys * //取出所有key
keys my* //模糊匹配
exists name //有name键 返回1 ,否则返回0;
del key1 // 删除一个key //成功返回1 ,否则返回0;
EXPIRE key1 100 //设置key1 100s后过期
ttl key // 查看键 还有多长时间过期,单位是s,当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,返回 key 的剩余生存时间。
select 0 //代表选择当前数据库,默认进入0 数据库
move age 1 // 把age 移动到1 数据库
persist key1 //取消key1的过期时间
127.0.0.1:6379> EXPIRE zh 1111
(integer) 1
127.0.0.1:6379> ttl zh
(integer) 1106
127.0.0.1:6379> ttl zh
(integer) 1104
127.0.0.1:6379> ttl zh
(integer) 1103
127.0.0.1:6379> PERSIST zh
(integer) 1
127.0.0.1:6379> ttl zh
(integer) -1
randomkey //随机返回一个key
rename oldname newname //重命名key
type key1 //返回键的类型
127.0.0.1:6379> TYPE zh
hash
127.0.0.1:6379> TYPE nn
set
127.0.0.1:6379> TYPE testkk
list
键值操作 (2)
dbsize //返回当前数据库中key的数目
info //返回redis数据库状态信息
flushdb /清空当前数据库中所有的键
flushall //清空所有数据库中的所有的key
bgsave //保存数据到 rdb文件中,在后台运行
save //作用同上,但是在前台运行
config get * //获取所有配置参数
config get dir //获取配置参数
config set dir //更改配置参数
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/data/redis"
127.0.0.1:6379> CONFIG GET timeout
1) "timeout"
2) "0"
数据恢复: 首先定义或者确定dir目录和dbfilename,然后把备份的rdb文件放到dir目录下面,重启redis服务即可恢复数据。
谈到安全,先说一个真实的例子:前两年Redis比较火的时候,也就是攻击最严重的时候。见到了很多次由Redis被黑导致系统被黑的案例!
怎么被黑的呢?
Redis 服务启动了,但是监听了一个全网IP,如果6379默认端口没有更改,并且iptables也处于关闭,公网IP 也开放着,Redis也没有设置任何密码,黑客就会扫描端口,然后就可以轻轻松松登录你的Redis服务器,并且是超级管理员的权限。然后黑客就可以设置dir dbname , dir 定义到/root/.ssh 且dbname定义为:.ssh/authorized_keys 再把这个值写上自己的公钥。 这些应该都不陌生吧,这不就活生生的把黑客的公钥上传到了咱们的服务器中,然后利用超级管理员做任何想做的事情了!!
当然解决也很简单:①设置密码 ②更改默认端口 ③监听内网IP ④设定专用账户 ⑤修改configure命令
设置监听ip
bind 127.0.0.1 2.2.2.2//可以是多个ip,用空格分隔
设置监听端口
port 16000
设置密码
requirepass asd9577
redis-cli -a 'asd9577'
将config命令改名
rename-command CONFIG asd
禁掉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.
[[email protected]01 ~]# redis-cli -a 'asd9577'
127.0.0.1:6379> SADD asd 12
(integer) 1
我们还可以使用如上所讲的 更改config 为自定义名称,就算黑客登录了你的redis服务器也不晓得你们的config是什么命令。
[[email protected]01 ~]# vim /etc/redis.conf
添加:rename-command CONFIG asd
[[email protected]01 ~]# killall redis-server
[[email protected]01 ~]# redis-server /etc/redis.conf
127.0.0.1:6379> CONFIG GET *
(error) ERR unknown command 'CONFIG'
127.0.0.1:6379> asd GET *
1) "dbfilename"
2) "dump.rdb"
3) "requirepass"
4) "asd9577"
5) "masterauth"
6) ""
7) "cluster-announce-ip"
8) ""
9) "unixsocket"
当然,最后一个就是禁掉 CONFIG