redis(1)
一、redis部署與使用
1.1:redis基礎
官網地址:https://redis.io/
Redis和Memcached是非關系型數據庫也稱為NoSQL數據庫,MySQL、Mariadb、SQL Server、PostgreSQL、Oracle 數據庫屬于關系型數據(RDBMS, Relational Database Management System)
1.1.1:redis簡介
redis是一個開源的、遵循BSD協議的、基于內存的而且目前比較流行的鍵值數據庫(key-value database),是一個非關系型數據庫,redis提供將內存通過網絡遠程共享的一種服務,提供類似功能的還有memcache,但相比memcache,redis還提供了易擴展、高性能、具備數據持久性等功能。
1.1.2:redis對比memcached
支持數據的持久化:可以將內存中的數據保持在磁盤中,重啟redis服務或者服務器之后可以從備份文件中恢復數據到內存繼續使用。支持更多的數據類型:支持string(字符串)、hash(哈希數據)、list(列表)、set(集合)、zet(有序集合) 支持數據的備份:可以實現類似于數據的master-slave模式的數據備份,另外也支持使用快照+AOF。 支持更大的value數據:memcache單個key value最大只支持1MB,而redis最大支持512MB。 Redis 是單線程,而memcache是多線程,所以單機情況下沒有memcache并發高,但redis 支持分布式集群以實現更高的并發,單Redis實例可以實現數萬并發。 支持集群橫向擴展:基于redis cluster的橫向擴展,可以實現分布式集群,大幅提升性能和數據安全性。 都是基于C語言開發。
1.2:Redis安裝及使用
官方下載地址:http://download.redis.io/releases/
1.2.1:編譯安裝redis
Redis的安裝非常方便,只需獲取源碼,然后make && make install即可。默認情況下,Redis的服務器啟動程序和客戶端程序會安裝到/usr/local/bin目錄下。在啟動Redis服務器時,我們需要為其指定一個配置文件,缺省情況下配置文件在Redis的源碼目錄下,文件名為redis.conf。下載當前release版本redis 源碼包:http://download.redis.io/releases/

1.2.1.1:編譯安裝命令
# pwd
/usr/local/src
# tar xf redis-4.0.14.tar.gz
# cd redis-4.0.14
#yum install gcc -y
#yum install jemalloc -y
#make MALLOC=libc
# make PREFIX=/app/redis install #指定redis安裝目錄
# mkdir /apps/redis/{etc,logs,data,run} #創建配置文件、日志、數據等目錄
# cp redis.conf /usr/local/redis/etc/
1.2.1.2:前臺啟動redis
[root@localhost redis-4.0.14]# /app/redis/bin/redis-server /usr/local/src/redis-4.0.14/redis.conf

1.2.1.3:解決當前的警告提示
5289:M 11 Feb 16:02:44.672 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 5289:M 11 Feb 16:02:44.672 # Server initialized 5289:M 11 Feb 16:02:44.672 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
第一個WARNING:
vim etc/sysctl.conf net.core.somaxconn = 1024
第二個WARNNING:
vim /etc/sysctl.conf vm.overcommit_memory = 1 sysctl -p
1.2.1.4:再次啟動redis
成功啟動

1.2.1.5:編輯redis服務啟動腳本
[Unit] Description=Redis persistent key-value database After=network.target After=network-online.target Wants=network-online.target [Service] ExecStart=/app/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID Type=notify User=redis Group=redis RuntimeDirectory=redis RuntimeDirectoryMode=0755 [Install] WantedBy=multi-user.target
1.2.1.6:創建redis 用戶
groupadd -g 1000 redis && useradd -u 1000 -g 1000 redis -s /sbin/nologin chown redis.redis -R /app/redis/
1.2.1.7:驗證是否redis啟動

1.2.1.8:使用客戶端連接redis
/app/redis/bin/redis-cli -h IP/HOSTNAME -p PORT -a PASSWORD
1.2.1.9:創建命令軟連接(以便全局使用)
[root@localhost redis]# ln -sv /app/redis/bin/redis-* /usr/bin/ ‘/usr/bin/redis-benchmark’ -> ‘/app/redis/bin/redis-benchmark’ ‘/usr/bin/redis-check-aof’ -> ‘/app/redis/bin/redis-check-aof’ ‘/usr/bin/redis-check-rdb’ -> ‘/app/redis/bin/redis-check-rdb’ ‘/usr/bin/redis-cli’ -> ‘/app/redis/bin/redis-cli’ ‘/usr/bin/redis-sentinel’ -> ‘/app/redis/bin/redis-sentinel’ ‘/usr/bin/redis-server’ -> ‘/app/redis/bin/redis-server’
1.2.2:連接到Redis
redis-cli #本機非密碼連接
進入之后使用AUTH passwd的方式 #本機密碼連接 配置文件中設置requirepass passwd redis-cli -h HOSTNAME/IP -p PORT 跨主機非密碼連接 redis-cli -h HOSTNAME/IP -p PORT -a PASSWORD #跨主機密碼連接
1.2.3:shell腳本寫入數據到Redis
#!/bin/bash NUM=`seq 1 100000` for i in ${NUM};do redis-cli -h 127.0.0.1 set key-${i} value-${i} echo "key-${i} value-${i} 寫入完成" done echo "十萬個key寫入到Redis完成
1.2.4:python連接方式
#!/bin/env python import redis import time pool = redis.ConnectionPool(host="192.168.7.101", port=6379,password="") r = redis.Redis(connection_pool=pool) for i in range(100): r.set("k%d" % i,"v%d" % i) time.sleep(1) data=r.get("k%d" % i) print(data)
1.3:redis配置文件
1.3.1:redis主要配置項
命令行修改:CONFIG SET
databases 16 #設置db 庫數量,默認16個庫,業務級別的分離,命令:SELECT num,python中db=num pidfile /var/run/redis_6379.pid #pid文件路徑 logfile "" #日志路徑 save 900 1 #在900秒內有一個鍵內容發生更改就出就快照機制 rdbcompression yes #持久化到RDB文件時,是否壓縮,"yes"為壓縮,"no"則反之 rdbchecksum yes #是否開啟RC64校驗,默認是開啟 dbfilename dump.rdb #快照文件名 dir ./ #快照文件保存路徑 replica-serve-stale-data yes #當從庫同主庫失去連接或者復制正在進行,從機庫有兩種運行方式: 1、如果replica-serve-stale-data設置為yes(默認設置),從庫會繼續響應客戶端的讀請求。 2、如果replica-serve-stale-data設置為no,除去指定的命令之外的任何請求都會返回一個錯誤"SYNC with master in progress"。在較慢并且網絡較快的時候,可以用diskless(yes),否則使用磁盤(no) repl-backlog-size 512mb #復制緩沖區內存大小,只有在slave連接之后才分配內。主從同步時使用,redis劃分的不包含這內存 maxmemory #最大內存,單位為bytes字節,一般為總內存的一半。0為不限制 appendonly no #是否開啟AOF日志記錄,默認redis使用的是rdb方式持久化,這種方式在許多應用中已經足夠用了,但是redis如果中途宕機,會導致可能有幾分鐘的數據丟失(取決于dumpd數據的間隔時間),根據save來策略進行持久化,
Append Only File是另一種持久化方式,可以提供更好的持久化特性,Redis會把每次寫入的數據在接收后都寫入 appendonly.aof 文件,每次啟動時Redis都會先把這個文件的數據讀入內存里,先忽略RDB文件。 lua-time-limit 5000 #lua腳本的最大執行時間,單位為毫秒 cluster-enabled yes #是否開啟集群模式,默認是單機模式 cluster-config-file nodes-6379.conf #由node節點自動生成的集群配置文件 cluster-node-timeout 15000 #集群中node節點連接超時時間 cluster-replica-validity-factor 10 #在執行故障轉移的時候可能有些節點和master斷開一段時間數據比較舊,這些節點就不適用于選舉為master,超過這個時間的就不會被進行故障轉移 cluster-migration-barrier 1 #集群遷移屏障,一個主節點擁有的至少正常工作的從節點,即如果主節點的slave節點故障后會將多余的從節點分配到當前主節點成為其新的從節點。 cluster-require-full-coverage no #集群請求槽位全部覆蓋,如果一個主庫宕機且沒有備庫就會出現集群槽位不全,那么yes情況下redis集群槽位驗證不全就不再對外提供服務,而no則可以繼續使用但是會出現查詢數據查不到的情況(因為有數據丟失)。 #Slow log 是 Redis 用來記錄查詢執行時間的日志系統,slow log 保存在內存里面,讀寫速度非常快,因此你可以放心地使用它,不必擔心因為開啟 slow log 而損害 Redis 的速度。 慢日志: slowlog-log-slower-than 10000 #以微秒為單位的慢日志記錄,為負數會禁用慢日志,為0會記錄每個命令操作。 slowlog-max-len 128 #記錄多少條慢日志保存在隊列,超出后會刪除最早的,以此滾動刪除 127.0.0.1:6379> slowlog get #獲取slowlog 1) 1) (integer) 6 2) (integer) 1581479461 3) (integer) 98 4) 1) "set" 2) "key1" 3) "v1" 127.0.0.1:6379> slowlog reset #清空slowlog OK 127.0.0.1:6379> slowlog len (integer) 1
1.4:redis 數據類型
http://www.redis.cn/topics/data-types.html
1.4.1.1:單個字符串(string)操作
127.0.0.1:6379> set key-1 value_1 #添加 OK 127.0.0.1:6379> get key-1 #獲取 "value_1" 127.0.0.1:6379> type key-1 #查看類型 string 127.0.0.1:6379> del key-1 #刪除 (integer) 1
1.4.1.2:批量設置多個key
127.0.0.1:6379> mset key-1 value-1 key_2 value-2 OK 127.0.0.1:6379> mget key-1 key_2 1) "value-1" 2) "value-2"
1.4.1.3:追加數據
127.0.0.1:6379> get key-1 "value-1" 127.0.0.1:6379> append key-1 append #在原來的字符上添加 (integer) 13 127.0.0.1:6379> get key-1 "value-1append"
1.4.1.4:數值遞增、遞減
127.0.0.1:6379> set num 0 OK 127.0.0.1:6379> get num "0" 127.0.0.1:6379> incr num #數值遞增 (integer) 1 127.0.0.1:6379> get num "1" 127.0.0.1:6379> decr num #數值遞減 (integer) 0 127.0.0.1:6379> get num "0"
1.4.1.5:key相關操作
127.0.0.1:6379> STRLEN key-1 #返回字符串key長度 (integer) 13 127.0.0.1:6379> EXISTS key-1 #判斷key是否存在 (integer) 1 127.0.0.1:6379> EXISTS key1 #不存在返回值為0 (integer) 0 127.0.0.1:6379> TTL key-1 #查看key的過期時間 (integer) -1 127.0.0.1:6379> TTL key1 (integer) -2 ttl #查看key的剩余生存時間 -1 #負一為永不過期,默認創建的key是永不過期,重新對key賦值,也會從有剩余生命周期變成永不過期 -2 #為沒有此key num #key的剩余有效期
127.0.0.1:6379> EXPIRE key-1 86400 #設置key的過期時間
(integer) 1
127.0.0.1:6379> PERSIST key-1 #取消key的過期時間
(integer) 1
1.4.2:列表(list)
列表是一個雙向可讀寫的管道,其頭部是左側尾部是右側,一個列表最多可以包含2^32-1個元素即4294967295個元素。
原則:數據先進先出;LPUSH—左側插入數據;RPUSH—右側插入數據;LPOP—從左側取數據;RPOP—從右側取數據
1.4.2.1:與列表相關的操作
127.0.0.1:6379> LPUSH list1 jack tom jhon #根據順序逐個寫入list1,最后的jhon會在列表的最左側。 (integer) 3 127.0.0.1:6379> TYPE list1 list 127.0.0.1:6379> LPUSH list1 lou #向列表追加數據 (integer) 4 127.0.0.1:6379> LLEN list1 #獲取列表長度 (integer) 4 127.0.0.1:6379> LRANGE list1 1 2 #指定范圍 1) "jhon" 2) "tom" 127.0.0.1:6379> RPOP list1 #移除列表數據最后一個 "jack" 127.0.0.1:6379> LLEN list1 (integer) 3 127.0.0.1:6379> LPOP list1 #移除列表數據第一個 "lou"
1.4.3:集合(set)
Set 是 String 類型的無序集合,集合中的成員是唯一的,這就意味著集合中不能出現重復的數據,可以在兩個不同的集合中對數據進行對比并取值。
1.4.3.1:
127.0.0.1:6379> SADD set1 v1 #生成集合key (integer) 1 127.0.0.1:6379> type v1 none 127.0.0.1:6379> type set1 set 127.0.0.1:6379> SADD set2 v2 v4 #追加數值 (integer) 2 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> SADD set1 v2 v3 v4 (integer) 3 127.0.0.1:6379> SMEMBERS set1 #查看集合的所有數據 1) "v2" 2) "v4" 3) "v1" 4) "v3" 127.0.0.1:6379> SDIFF set1 set2 #差集:已屬于A而不屬于B的元素稱為A與B的差(集) 1) "v1" 2) "v3" 127.0.0.1:6379> SINTER set1 set2 #交集:已屬于A且屬于B的元素稱為A與B的交(集) 1) "v2" 2) "v4" 127.0.0.1:6379> SUNION set1 set2 #并集:已屬于A或屬于B的元素為稱為A與B的并(集) 1) "v1" 2) "v4" 3) "v3" 4) "v2" 127.0.0.1:6379> SUNION set1 set2 1) "v1" 2) "v4" 3) "v3" 4) "v2"
1.4.4:哈希(hash)
hash 是一個string類型的field和value的映射表,hash特別適合用于存儲對象,Redis 中每個 hash 可以存儲 2^32 -1 鍵值對(40多億)。
127.0.0.1:6379> HSET hash1 name tom age 18 #生成hash key (integer) 2 127.0.0.1:6379> TYPE hash1 hash 127.0.0.1:6379> HGET hash1 name #獲取hash key字段值 "tom" 127.0.0.1:6379> HGET hash1 age "18" 127.0.0.1:6379> HDEL hash1 age #刪除一個hash key的字段 (integer) 1 127.0.0.1:6379> HMSET hash1 name tom age 19 #獲取所有hash表中的key OK 127.0.0.1:6379> HKEYS hash1 1) "name" 2) "age" 127.0.0.1:6379> HGETALL hash1 #獲取指定hash的所有key及value 1) "name" 2) "tom" 3) "age" 4) "19"
浙公網安備 33010602011771號