集羣
https://www.cnblogs.com/zy-303/p/10273167.html
分佈式鎖
https://blog.csdn.net/qq_33814088/article/details/83347757
https://blog.csdn.net/u010963948/article/details/79240050
JAVA實現
https://blog.csdn.net/qq_33814088/article/details/83347757
安裝 redis 6.0
http://www.luyixian.cn/news_show_369871.aspx
重點是gcc升級到9.0以上
# 查看gcc版本是否在5.3以上,centos7.6默認安裝4.8.5 gcc -v
# 升級gcc到5.3及以上,如下: 升級到gcc 9.3:
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
需要注意的是scl命令啓用只是臨時的,退出shell或重啓就會恢復原系統gcc版本。
如果要長期使用gcc 9.3的話: echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
這樣退出shell重新打開就是新版的gcc了 以下其他版本同理,修改devtoolset版本號即可。
Q使用wget工具等下載:
wget (百度不讓用鏈接)
tar xzf redis-1.2.6.tar.gz
cd redis-1.2.6。
編譯生成可執行文件
由於makefile文件已經寫好,我們只需要直接在源碼目錄執行make命令進行編譯即可:可以使用(make PREFIX=/data/redis(啓動目錄) install)
make
make命令執行完成後,會在當前目錄下生成本個可執行文件,分別是redis-server、redis-cli、redis-benchmark、redis-stat,它們的作用如下:
redis-server:Redis服務器的daemon啓動程序
redis-cli:Redis命令行操作工具。當然,你也可以用telnet根據其純文本協議來操作
redis-benchmark:Redis性能測試工具,測試Redis在你的系統及你的配置下的讀寫性能
redis-stat:Redis狀態檢測工具,可以檢測Redis當前狀態參數及延遲狀況。
建立Redis目錄(非必須)
這個過程不是必須的,只是爲了將Redis相關的資源統一管理而進行的操作。
執行以下命令建立相關目錄並拷貝相關文件至目錄中:
sudo -s
mkdir -p /usr/local/redis/bin
mkdir -p /usr/local/redis/etc
mkdir -p /usr/local/redis/var
cp redis-server redis-cli redis-benchmark redis-stat /usr/local/redis/bin/
cp redis.conf /usr/local/redis/etc/
配置參數
在我們成功安裝Redis後,我們直接執行redis-server即可運行Redis,此時它是按照默認配置來運行的(默認配置甚至不是後臺運行)。我們希望Redis按我們的要求運行,則我們需要修改配置文件,Redis的配置文件就是我們上面第二個cp操作的redis.conf文件,它被我們拷貝到了/usr/local/redis/etc/目錄下。修改它就可以配置我們的server了。如何修改?下面是redis.conf的主要配置參數的意義:
daemonize:是否以後臺daemon方式運行
pidfile:pid文件位置
port:監聽的端口號
timeout:請求超時時間
loglevel:log信息級別
logfile:log文件位置
databases:開啓數據庫的數量
save * *:保存快照的頻率,第一個*表示多長時間,第三個*表示執行多少次寫操作。在一定時間內執行一定數量的寫操作時,自動保存快照。可設置多個條件。
rdbcompression:是否使用壓縮
dbfilename:數據快照文件名(只是文件名,不包括目錄)
dir:數據快照的保存目錄(這個是目錄)
appendonly:是否開啓appendonlylog,開啓的話每次寫操作會記一條log,這會提高數據抗風險能力,但影響效率。
appendfsync:appendonlylog如何同步到磁盤(三個選項,分別是每次寫都強制調用fsync、每秒啓用一次fsync、不調用fsync等待系統自己同步)
下面是一個略做修改後的配置文件內容:
daemonize yes
pidfile /usr/local/redis/var/redis.pid
port 6379
timeout 300
loglevel debug
logfile /usr/local/redis/var/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /usr/local/redis/var/ (注:讓數據持久化保存路徑必須和啓動目錄同一個大路徑下才能把數據持久化到硬盤,即不能誇目錄保存數據)
appendonly no
appendfsync always
glueoutputbuf yes
shareobjects no
shareobjectspoolsize 1024
將上面內容寫爲redis.conf並保存到/usr/local/redis/etc/目錄下
然後在命令行執行:(常駐內存)
nohup /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf &
即可在後臺啓動redis服務,這時你通過
telnet127.0.0.16379
即可連接到你的redis服務
Redis常用命令集
批量刪除keys
https://www.cnblogs.com/0201zcr/p/9647787.html
1)連接操作命令
- quit:關閉連接(connection)
- auth:簡單密碼認證
- help cmd: 查看cmd幫助,例如:help quit
2)持久化
- save:將數據同步保存到磁盤
- bgsave:將數據異步保存到磁盤
- lastsave:返回上次成功將數據保存到磁盤的Unix時戳
- shundown:將數據同步保存到磁盤,然後關閉服務
3)遠程服務控制
- info:提供服務器的信息和統計
- monitor:實時轉儲收到的請求
- slaveof:改變複製策略設置
- config:在運行時配置Redis服務器
4)對value操作的命令
- exists(key):確認一個key是否存在
- del(key):刪除一個key
- type(key):返回值的類型
- keys(pattern):返回滿足給定pattern的所有key
- randomkey:隨機返回key空間的一個
- keyrename(oldname, newname):重命名key
- dbsize:返回當前數據庫中key的數目
- expire:設定一個key的活動時間(s)
- ttl:獲得一個key的活動時間
- select(index):按索引查詢
- move(key, dbindex):移動當前數據庫中的key到dbindex數據庫
- flushdb:刪除當前選擇數據庫中的所有key
- flushall:刪除所有數據庫中的所有key
5)String
- set(key, value):給數據庫中名稱爲key的string賦予值value
- get(key):返回數據庫中名稱爲key的string的value
- getset(key, value):給名稱爲key的string賦予上一次的value
- mget(key1, key2,…, key N):返回庫中多個string的value
- setnx(key, value):添加string,名稱爲key,值爲value
- setex(key, time, value):向庫中添加string,設定過期時間time
- mset(key N, value N):批量設置多個string的值
- msetnx(key N, value N):如果所有名稱爲key i的string都不存在
- incr(key):名稱爲key的string增1操作
- incrby(key, integer):名稱爲key的string增加integer
- decr(key):名稱爲key的string減1操作
- decrby(key, integer):名稱爲key的string減少integer
- append(key, value):名稱爲key的string的值附加value
- substr(key, start, end):返回名稱爲key的string的value的子串
6)List
- rpush(key, value):在名稱爲key的list尾添加一個值爲value的元素
- lpush(key, value):在名稱爲key的list頭添加一個值爲value的 元素
- llen(key):返回名稱爲key的list的長度
- lrange(key, start, end):返回名稱爲key的list中start至end之間的元素
- ltrim(key, start, end):截取名稱爲key的list
- lindex(key, index):返回名稱爲key的list中index位置的元素
- lset(key, index, value):給名稱爲key的list中index位置的元素賦值
- lrem(key, count, value):刪除count個key的list中值爲value的元素
- lpop(key):返回並刪除名稱爲key的list中的首元素
- rpop(key):返回並刪除名稱爲key的list中的尾元素
- blpop(key1, key2,… key N, timeout):lpop命令的block版本。
- brpop(key1, key2,… key N, timeout):rpop的block版本。
- rpoplpush(srckey, dstkey):返回並刪除名稱爲srckey的list的尾元素,並將該元素添加到名稱爲dstkey的list的頭部
7)Set
- sadd(key, member):向名稱爲key的set中添加元素member
- srem(key, member) :刪除名稱爲key的set中的元素member
- spop(key) :隨機返回並刪除名稱爲key的set中一個元素
- smove(srckey, dstkey, member) :移到集合元素
- scard(key) :返回名稱爲key的set的基數
- sismember(key, member) :member是否是名稱爲key的set的元素
- sinter(key1, key2,…key N) :求交集
- sinterstore(dstkey, (keys)) :求交集並將交集保存到dstkey的集合
- sunion(key1, (keys)) :求並集
- sunionstore(dstkey, (keys)) :求並集並將並集保存到dstkey的集合
- sdiff(key1, (keys)) :求差集
- sdiffstore(dstkey, (keys)) :求差集並將差集保存到dstkey的集合
- smembers(key) :返回名稱爲key的set的所有元素
- srandmember(key) :隨機返回名稱爲key的set的一個元素
8)Hash
- hset(key, field, value):向名稱爲key的hash中添加元素field
- hget(key, field):返回名稱爲key的hash中field對應的value
- hmget(key, (fields)):返回名稱爲key的hash中field i對應的value
- hmset(key, (fields)):向名稱爲key的hash中添加元素field
- hincrby(key, field, integer):將名稱爲key的hash中field的value增加integer
- hexists(key, field):名稱爲key的hash中是否存在鍵爲field的域
- hdel(key, field):刪除名稱爲key的hash中鍵爲field的域
- hlen(key):返回名稱爲key的hash中元素個數
- hkeys(key):返回名稱爲key的hash中所有鍵
- hvals(key):返回名稱爲key的hash中所有鍵對應的value
- hgetall(key):返回名稱爲key的hash中所有的鍵(field)及其對應的value
Redis高級應用
1、安全性
設置客戶端連接後進行任何操作指定前需要密碼,一個外部用戶可以再一秒鐘進行150W次訪問,具體操作密碼修改設置redis.conf裏面的requirepass屬性給予密碼,當然我這裏給的是primos
之後如果想操作可以採用登陸的時候就授權使用:
sudo /opt/java/redis/bin/redis-cli -a primos
或者是進入以後auth primos然後就可以隨意操作了
2、主從複製
做這個操作的時候我準備了兩個虛擬機,ip分別是192.168.15.128和192.168.15.133
通過主從複製可以允許多個slave server擁有和master server相同的數據庫副本
具體配置是在slave上面配置slave
slaveof 192.168.15.128 6379
masterauth primos
如果沒有主從同步那麼就檢查一下是不是防火牆的問題,我用的是ufw,設置一下sudo ufw allow 6379就可以了
這個時候可以通過info查看具體的情況
3、事務處理
redis對事務的支持還比較簡單,redis只能保證一個client發起的事務中的命令可以連續執行,而中間不會插入其他client的命令。當一個client在一個連接中發出multi命令時,這個連接會進入一個事務的上下文,連接後續命令不會立即執行,而是先放到一個隊列中,當執行exec命令時,redis會順序的執行隊列中的所有命令。
比如我下面的一個例子
set age 100
multi
set age 10
set age 20
exec
get age --這個內容就應該是20
multi
set age 20
set age 10
exec
get age --這個時候的內容就成了10,充分體現了一下按照隊列順序執行的方式
discard 取消所有事務,也就是事務回滾
不過在redis事務執行有個別錯誤的時候,事務不會回滾,會把不錯誤的內容執行,錯誤的內容直接放棄,目前最新的是2.6.7也有這個問題的
樂觀鎖
watch key如果沒watch的key有改動那麼outdate的事務是不能執行的
4、持久化機制
redis是一個支持持久化的內存數據庫
snapshotting快照方式,默認的存儲方式,默認寫入dump.rdb的二進制文件中,可以配置redis在n秒內如果超過m個key被修改過就自動做快照
append-only file aof方式,使用aof時候redis會將每一次的函 數都追加到文件中,當redis重啓時會重新執行文件中的保存的寫命
令在內存中。
5、發佈訂閱消息 sbusribe publish操作,其實就類似linux下面的消息發佈
6、虛擬內存的使用
可以配置vm功能,保存路徑,最大內存上線,頁面多少,頁面大小,最大工作線程
臨時修改ip地址ifconfig eth0 192.168.15.129
常用命令:
1) 查看keys個數
keys * // 查看所有keys
keys prefix_* // 查看前綴爲"prefix_"的所有keys
2) 清空數據庫
flushdb // 清除當前數據庫的所有keys
flushall // 清除所有數據庫的所有keys
3)批量刪除模糊key
./redis-cli KEYS "*|*N" | xargs redis-cli del