21.13/21.14/21.15 redis经常使用操做php
21.16 redis操做键值、服务linux
21.17 redis安全设置redis
21.13/21.14/21.15 redis经常使用操做数据库
1.Redis经常使用操做 stringvim
set key1 aminglinux安全
get key1app
set key1 aming//第二次赋值会覆盖dom
setnx key2 aaa //返回1 若是key2不存在直接建立keyui
setnx key2 bbb //返回0,若是key2存在,返回0加密
setex key3 10 1 //给key3设置过时时间为10s,值为1,若key已经存在,会覆盖新的值
mset k1 1 k2 a k3 c #同时写多个
mget k1 k3 k2 #同时查看多个
2.Redis经常使用操做 list
lpush lista a //从左侧加入一个元素,左侧就是最上面。l表明左(最上面)
lpush lista b
lrange lista 0 -1
lpop lista //从左侧取出第一个元素。
rpush lista 1 //从右侧加入一个元素 。r表明右(最下面)
rpop lista //从右侧取出第一个元素。不管是lpop仍是rpop,取出来的值就不存在了
linsert lista before 2 3 //在2的前面插入一个元素为3。此处的2表示第二个元素的值
linsert lista after 2 3 #在2的后面插入一个元素为3。此处的2表示第二个元素的值
lset lista 4 bbb //把第5个元素修改成bbb 此处的4表示第5个元素(0也算一个数字)
lindex lista 0 //查看第1个元素
lindex lista 3 //查看第4个元素
llen lista //查看链表中有几个元素
3.Redis经常使用操做 set
sadd seta aaa //向集合seta中放入元素
smembers seta //查看集合中的全部元素
srem seta aaa //删除元素
spop seta //随机取出一个元素,取出后就没有了
sdiff seta setb //求差集,以seta为标准。哪一个在前面,就根据哪一个作比较
sdiffstore setc seta setb //求差集而且存储,存储到了setc里
sinter seta setb //求交集
sinterstore setd seta setb //将交集存储setd
sunion seta setb //求并集
sunionstore sete seta setb //求并集并存储到sete
sismember seta aaa //判断一个元素是否在这个集合里,有返回1,没有返回0
srandmember seta //随机取出一个元素,但不删除。后面还能够加数字,就是取几个元素,一样不删除。与spop的区别
4.Redis经常使用操做 sort set
zadd zseta 11 123 //建立有序集合,11是他的score
zrange zseta 0 -1 //显示全部元素,按顺序显示
zrange zseta 0 -1 withscores //能够带上分值
zrem zseta 222 //删除指定元素
zrank zseta 222 //返回元素的索引值,索引值从0开始,按score正向排序。也就是查看222这个元素的下标(就是第几个)
zrevrank zseta 222 //同上,不一样的是,按score反序排序。也就是倒着数222这个元素为第几个
zrevrange zseta 0 -1 反序显示全部元素,并带分值
zcard zseta //返回集合中全部元素的个数
zcount zseta 1 10 // 返回分值范围1-10的元素个数
zrangebyscore zseta 1 10 // 返回分值范围1-10的元素
zremrangebyrank zseta 0 2 //删除索引范围0-2的元素,按score正向排序。索引的范围就是下标
zremrangebyscore zseta 1 10 //删除分值范围1-10的元素
5.Redis经常使用操做(hash)
hset user1 name aming //创建hash
hset user1 age 30
hset user1 job it
hgetall user1 #查看user1的信息
hmset user2 name aming age 30 job it //批量创建键值对
hmget user2 name age job
hdel user2 job //删除指定filed
hkeys user2 //打印全部的key。也就是查看
hvals user2 //打印全部的values
hlen user2 //查看hash有几个filed。也就是有几个键
实例:
1.string
127.0.0.1:6379> set key1 axin #set key1的值
OK
127.0.0.1:6379> set key2 linux #set key2的值
OK
127.0.0.1:6379> set key1 axinlinux #再次set key1就会覆盖
OK
127.0.0.1:6379> get key1
"axinlinux"
127.0.0.1:6379> setnx key1 aaa #setnx key1(已有的值),不会覆盖,会返回数字0
(integer) 0
127.0.0.1:6379> setnx key10 aaa #setnx key10(没有的值),会建立,会返回数字1
(integer) 1
127.0.0.1:6379> get key10
"aaa"
127.0.0.1:6379> set key3 aaa ex 10 #正常写set的时候,后面要加ex,就是设置他的过时时间
OK
127.0.0.1:6379> get key3 #10秒之后再get就没有了
(nil)
127.0.0.1:6379> setex key3 1000 bbb #setex key3 先跟的是过时时间,而后是value
OK
127.0.0.1:6379> get key3
"bbb"
2.list
127.0.0.1:6379> lpush list2 bbb #lpush list2 的value为bbb
(integer) 1
127.0.0.1:6379> lpush list2 ccc #再lpush一个value
(integer) 2
127.0.0.1:6379> LRANGE list2 0 -1 #lange查看list2
1) "ccc"
2) "bbb"
127.0.0.1:6379> lpop list2 #lpop list2,从最上面取一个value
"ccc"
127.0.0.1:6379> lrange list2 0 -1 #lrange list2 ,只剩下那个旧的value了
1) "bbb"
127.0.0.1:6379> rpush list2 axin1 #rpush list2 一个value为axin1。也就是从最下面写进去
(integer) 2
127.0.0.1:6379> rpush list2 axin2 #再rpush
(integer) 3
127.0.0.1:6379> LRANGE list2 0 -1 #lrange一下list2
1) "bbb"
2) "axin1"
3) "axin2"
127.0.0.1:6379> rpop list2 #而后咱们再rpop list2.也就是在最下面取出一个value
"axin2"
127.0.0.1:6379> LRANGE list2 0 -1 #lrange list2,发现最下面的value被取走了
1) "bbb"
2) "axin1"
127.0.0.1:6379> linsert list2 before axin1 axin0 #linsert list2 axin1这个元素前面插入axin0.
(integer) 3
127.0.0.1:6379> lrange list2 0 -1
1) "bbb"
2) "axin0"
3) "axin1"
127.0.0.1:6379> linsert list2 after axin1 axin2 #在axin1这个元素后面插入一个元素为axin2
(integer) 4
127.0.0.1:6379> lrange list2 0 -1
1) "bbb"
2) "axin0"
3) "axin1"
4) "axin2"
127.0.0.1:6379> lset list2 0 bbb #把第0个元素的值改成bbb。0表示第1个
OK
127.0.0.1:6379> lrange list2 0 -1
1) "bbb"
2) "linux"
3) "axin1"
4) "axin2"
127.0.0.1:6379> lindex list2 0 #查看第一个元素的值
"bbb"
127.0.0.1:6379> llen list2 #查看list2里面有几个元素
(integer) 4
3.set
127.0.0.1:6379> sadd set1 aaa #sadd放入一个元素
(integer) 1
1) "c"
2) "d"
3) "aaa"
4) "ccc"
5) "b"
6) "a"
7) "bbb"
127.0.0.1:6379> srem set1 aaa #删除元素aaa
(integer) 1
127.0.0.1:6379> spop set1 #随机取出一个元素
"d"
127.0.0.1:6379> SMEMBERS set2
1) "1"
2) "ccc"
3) "b"
4) "a"
5) "2"
6) "bbb"
127.0.0.1:6379> smembers set1
1) "ccc"
2) "b"
3) "a"
4) "c"
5) "bbb"
127.0.0.1:6379> SDIFF set2 set1 #adiff求差集。set2在前面,因此set2做为比较的对象
1) "1"
2) "2"
4.sort set
127.0.0.1:6379> zadd zseta 0 1ab #写入一个score为0 值为1ab的元素
(integer) 1
127.0.0.1:6379> zrange zseta 0 -1 #查看zseta这个有序集合
1) "1ab"
127.0.0.1:6379> zrem zseta 1ab #删除1ab这个元素
(integer) 1
127.0.0.1:6379> zrange zeta 0 -1 #再次查看就是空的
(empty list or set)
127.0.0.1:6379> zrank zseta 123 #正序查看123这个元素是第几个(下标)
(integer) 0
127.0.0.1:6379> zrevrank zseta 123 #倒序查看123这个元素是第几个(下标)
(integer) 4
127.0.0.1:6379> zrevrange zseta 0 -1 #倒序查看zseta集合
1) "fasf"
2) "2143safdas"
3) "2134353"
4) "fasfas"
5) "123"
127.0.0.1:6379> zcard zseta #查看zseta集合有几个元素
(integer) 5
127.0.0.1:6379> zcount zseta 50 1000 #查看50-1000 score值的个数
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE zseta 10 19 #查看score值10-19的元素
1) "123"
2) "fasfas"
3) "2134353"
127.0.0.1:6379> zadd seta 12 asfasfasfas #写入几个元素,为下面的zremrangebyrank和zremrangebyscore作区分
(integer) 1
127.0.0.1:6379> zadd seta 22 123asfasfasfas
(integer) 1
127.0.0.1:6379> zadd seta 32 123asfass
(integer) 1
127.0.0.1:6379> zadd seta 82 123asfas123s
(integer) 1
127.0.0.1:6379> zadd seta 102 123as123s
(integer) 1
127.0.0.1:6379> zrange seta 0 -1
1) "asfasfasfas"
2) "123asfasfasfas"
3) "123asfass"
4) "123asfas123s"
5) "123as123s"
127.0.0.1:6379> zremrangebyrank seta 0 1 #删除0-1(分值,也就是下标,第几个的个数)
(integer) 2
127.0.0.1:6379> zrange seta 0 -1
1) "123asfass"
2) "123asfas123s"
3) "123as123s"
127.0.0.1:6379> zremrangebyscore seta 30 80 #删除30-80(score值)
(integer) 1
127.0.0.1:6379> zrange seta 0 -1
1) "123asfas123s"
2) "123as123s"
5.hash
127.0.0.1:6379> hmset hash2 a 1 b 2 c 3 d 4 #分别指定他的key和value的值,来建立
OK
127.0.0.1:6379> hgetall hash2 #查看hash2的key和value
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "d"
8) "4"
127.0.0.1:6379> hmget hash2 b c #查看b和c的value
1) "2"
2) "3"
127.0.0.1:6379> hdel hash2 b #删除b
(integer) 1
127.0.0.1:6379> hkeys hash2 #查看全部的key
1) "a"
2) "c"
3) "d"
127.0.0.1:6379> HVALS hash2 #查看全部的value
1) "1"
2) "3"
3) "4"
127.0.0.1:6379> hlen hash2 #查看hash2里面有几个
(integer) 3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.16 redis操做键值、服务
1.Redis经常使用操做(键值)
1.keys * //取出全部key
2.keys my* //模糊匹配
3.exists name //有name键 返回1 ,不然返回0;也就是查看key是否存在
4.del key1 // 删除一个key //成功返回1 ,不然返回0;
5.EXPIRE key1 100 //设置key1 100s后过时
6.ttl key // 查看键 还有多长时间过时,单位是s,当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 不然,返回 key 的剩余生存时间。
7.select 0 //表明选择当前数据库,默认进入0 数据库。为1时,就进入1库
redis.conf配置文件时,有讲到redis有16个库,默认是0库
8.move age 1 // 把age 移动到1 数据库
9.persist key1 //取消key1的过时时间。会返回-1
10.randomkey //随机返回一个key
11.rename oldname newname //重命名key
12.type key1 //返回键的类型。五种数据类型,查看是哪种
2.Redis经常使用操做(服务)
1.dbsize //返回当前数据库中key的数目
2.info //返回redis数据库状态信息
3.flushdb //清空当前数据库中全部的键
4.flushall //清空全部数据库中的全部的key
5.bgsave //保存数据到 rdb文件中,在后台运行。(bg为到后台的意思,save为保存的意思,在redis.conf中save那三行也表明了rdb。除了知足那三种条件,也能够这样手动的让他去保存。能够这样来理解)
6.save //做用同上,可是在前台运行。也就是当前窗口下运行
7.config get * //获取全部配置参数。就是配置文件里配置的东西
8.config get dir //获取配置参数
9.config set dir //更改配置参数
10.数据恢复: 首先定义或者肯定dir目录和dbfilename(能够config get看一下),实例中有详解以及坑
实例:
1.
127.0.0.1:6379> KEYS * #取出全部的键
1) "seta"
2) "key10"
3) "key2"
4) "key1"
5) "list2"
6) "list1"
7) "set1"
8) "set2"
9) "hash2"
10) "hash1"
11) "zseta"
12) "mykey"
13) "set3"
127.0.0.1:6379> KEYS k* #全部的k开头的,模糊搜索
1) "key10"
2) "key2"
3) "key1"
127.0.0.1:6379> exists key1 #查看key1是否存在
(integer) 1 #存在返回1
127.0.0.1:6379> exists key11
(integer) 0 #不存在返回0
127.0.0.1:6379> del key1 #删除key1
(integer) 1
127.0.0.1:6379> get key1 #再次查看key1,就没有了
(nil)
127.0.0.1:6379> EXPIRE key2 10 #给key2设置过时时间10秒
(integer) 1 #一样成功返回1
127.0.0.1:6379> get key2 #10秒后查看,就不存在了
(nil)
127.0.0.1:6379> EXPIRE key111 10 #咱们给一个不存在的key111设置过时时间,会发现返回0,也就是说他不会给不存在的key设置过时时间
(integer) 0
127.0.0.1:6379> get key111 #咱们查看就会没有
(nil)
127.0.0.1:6379> EXPIRE key10 15 #给key10设置15秒过时时间
(integer) 1
127.0.0.1:6379> ttl key10 #查看key10的过时时间
(integer) 8
127.0.0.1:6379> ttl key10 #ttl查看时返回-2,就表明已通过期
(integer) -2
127.0.0.1:6379> SELECT 1 #先进入1库
OK
127.0.0.1:6379[1]> keys * #查看key,就会没有key。由于咱们没有往1库里写东西
(empty list or set)
127.0.0.1:6379[1]> SELECT 0 #咱们再进入0库
OK
127.0.0.1:6379> keys * #就会出现咱们以前写的key
1) "seta"
2) "list2"
3) "list1"
4) "set1"
5) "set2"
6) "hash2"
7) "hash1"
8) "zseta"
9) "mykey"
10) "set3"
127.0.0.1:6379> move set2 1 #把set2启动到1库里
(integer) 1
127.0.0.1:6379> SELECT 1 #进入1库
OK
127.0.0.1:6379[1]> keys * #查看一下,就会有这个set2
1) "set2"
127.0.0.1:6379> EXPIRE mykey 1000 #先给mykey社会自一个过时时间
(integer) 1
127.0.0.1:6379> ttl mykey #ttl一下
(integer) 992
127.0.0.1:6379> PERSIST mykey #而后再取消他的过时时间
(integer) 1
127.0.0.1:6379> ttl mykey #再次ttl一下。会发现返回-1.-1就是没有过时时间
(integer) -1
127.0.0.1:6379> type zseta #查看zseta的数据类型
zset
127.0.0.1:6379> type mykey
string
127.0.0.1:6379> type list2
list
2.
127.0.0.1:6379> DBSIZE #当前库中的key的数目
(integer) 9
127.0.0.1:6379> info [section] #info后面也能够查看他的具体项,好比cpu相关的
127.0.0.1:6379> SELECT 1 #咱们先选择1库
OK
127.0.0.1:6379[1]> keys * #查看一下,有以前的那个set2
1) "set2"
127.0.0.1:6379[1]> FLUSHDB #flushdb一下,清空当前的库
OK
127.0.0.1:6379[1]> keys * #再次查看就没有了
(empty list or set)
127.0.0.1:6379[1]> FLUSHALL #flushall为清空全部库中的key
127.0.0.1:6379[1]> bgsave #后台将数保存到rdb文件中(/data/reids/dump.rdb配置文件中指定的路径),速度的快慢取决于你文件的大小
Background saving started
127.0.0.1:6379> config get * #共有168行,其实就是84项,奇数为配置项,偶数为配置内容。就是配置文件里配置的。
127.0.0.1:6379> config get bind #也能够指定查看意向配置内容,好比bind
1) "bind"
2) "127.0.0.1"
127.0.0.1:6379> config get dir #好比dir
1) "dir"
2) "/data/redis"
127.0.0.1:6379> config set timeout 100 #也支持config set,更改配置项。好比讲timeout改为100
OK
127.0.0.1:6379> config get timeout #再次查看timeout就是100了
timeout指的是设置客户端链接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该链接
1) "timeout"
2) "100"
10.如下数据恢复(rdb):
127.0.0.1:6379> keys * #先查看一下要恢复以前的数据
1) "key2"
2) "key3"
3) "key1"
127.0.0.1:6379> config get dir #要看一下dir的路径,由于等会save的时候会把备份文件存到这个路径下
1) "dir"
2) "/data/redis"
127.0.0.1:6379> config get dbfilename #备份文件的名字也要看一下
1) "dbfilename"
2) "dump.rdb"
127.0.0.1:6379> save #而后save保存.rdb文件
OK
127.0.0.1:6379> quit #退出redis
[root@axinlinux-01 redis-4.0.1]# cd /data/redis/ #cd到dir路径下,看一下有没有这个dump.rdb文件
[root@axinlinux-01 redis]# ls
appendonly.aof dump.rdb
[root@axinlinux-01 redis]# cd /tmp/ #cd到tmp下来,把dump.rdb备份文件先拷贝到tmp下来。由于咱们等下作实验执行flushall的时候,他会把这个备份文件也给清空掉。因此要提早拷贝走
[root@axinlinux-01 tmp]# cp /data/redis/dump.rdb ./
[root@axinlinux-01 tmp]# ls
dump.rdb systemd-private-62ddbfad8a1c4de29c4f34e73330fea8-chronyd.service-dAZNvV
php-fcgi.sock systemd-private-62ddbfad8a1c4de29c4f34e73330fea8-vgauthd.service-wL8DBk
sess_6p44behpfdiaaqhehrvrhfede1 systemd-private-62ddbfad8a1c4de29c4f34e73330fea8-vmtoolsd.service-BYddey
[root@axinlinux-01 redis]# redis-cli
127.0.0.1:6379> FLUSHALL #而后这个时候咱们再flushall
OK
127.0.0.1:6379> keys * #查看一下,数据已被清空
(empty list or set)
127.0.0.1:6379> quit
[root@axinlinux-01 redis]# killall redis-server #咱们用killall这个命令来关闭redis
[root@axinlinux-01 redis]# ps aux |grep redis #看一下是否被关闭
root 3487 0.0 0.0 112720 980 pts/0 R+ 23:04 0:00 grep --color=auto redis
[root@axinlinux-01 redis]# rm -rf dump.rdb #把原先的dump.rdb文件删掉。由于咱们以前执行了flushall,这个备份文件也一样被执行了
[root@axinlinux-01 redis]# ls
appendonly.aof
[root@axinlinux-01 redis]# cp /tmp/dump.rdb ./ #而后把flushall以前的备份文件拷贝过来
[root@axinlinux-01 redis]# ls
appendonly.aof dump.rdb
[root@axinlinux-01 redis]# redis-server /etc/redis.conf #而后再启动redis
[root@axinlinux-01 redis]# ps aux |grep redis
root 3547 2.0 0.4 145296 7572 ? Ssl 23:05 0:00 redis-server 127.0.0.1:6379
root 3561 0.0 0.0 112720 980 pts/0 S+ 23:05 0:00 grep --color=auto redis
[root@axinlinux-01 redis]# redis-cli #而后进入redis,查看是否已经恢复
127.0.0.1:6379> keys *
1) "key1"
2) "key3"
3) "key2"
总结数据恢复(rdb)
恢复以前要先确认dir路径以及备份文件的名字。而后再save。以后要在清空数据以前把save以后的.rdb文件拷贝到tmp下。而后再执行flushall命令,不然flushall命令会把.rdb备份文件的数据清空掉,那这样备份就没有意义了。而后killall掉redis-server,把原先的.rdb文件删掉,再把tmp下备份的.rdb文件拷贝过来。重启redis就能够了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.17 redis安全设置
如下的操做都是在/etc/redis.conf配置文件里,配置的。若是担忧有人查看conf配置文件,能够限定文件或目录的权限
1.设置监听ip
bind 127.0.0.1 2.2.2.2//能够是多个ip,用空格分隔
能够设置成监听内网IP
2.设置监听端口
port 16000
将默认6379端口能够改成16000(随便其余不被占用的有效端口)
3.设置密码
requirepass aming>com #加入这一行
redis-cli -a 'aming>com' #登陆的时候加-a '密码'登陆,由于密码中含有>,因此要用单引号
4.将config命令更名
rename-command CONFIG aming #aming表明要把config替换成的命令
/etc/redis.conf配置文件里,搜索 rename-command,加到下面这一行就能够了
5.禁掉config命令
rename-command CONFIG “” #双引号内为空就能够了
/etc/redis.conf配置文件里,搜索 rename-command
实例:
3.
[root@axinlinux-01 redis]# vim /etc/redis.conf #修改配置文件。把这一行加入进去
requirepass aming>com #加在哪均可以,好比加在最后面
[root@axinlinux-01 redis]# killall redis-server #killall掉redis,再重启。由于是编译安装的,只能先killall掉
[root@axinlinux-01 redis]# redis-server /etc/redis.conf #再启动
[root@axinlinux-01 redis]# redis-cli #咱们不加密码登陆试一下
127.0.0.1:6379> keys * #也能登陆,可是执行不了命令
(error) NOAUTH Authentication required.
127.0.0.1:6379> quit
[root@axinlinux-01 redis]# redis-cli -a 'aming>com' #而后再-a加密码启动
127.0.0.1:6379> keys * #就能够执行了
1) "key2"
2) "key3"
3) "key1"