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"