redis介紹 redis是什麼 redis是一種基於鍵值對的NOsql資料庫,與很多鍵值對資料庫不同,redis中的值 等多種數據機構和演算法組成,因為redis會將所有的數據都放在記憶體中,所以他的讀寫性能非常驚人,不僅如此,redis還可以將記憶體中的數據利用快照和日誌的形式保存在硬碟上,redis ...
redis介紹
redis是什麼
redis是一種基於鍵值對的NOsql資料庫,與很多鍵值對資料庫不同,redis中的值string,hash,list,set,zset,geo
等多種數據機構和演算法組成,因為redis會將所有的數據都放在記憶體中,所以他的讀寫性能非常驚人,不僅如此,redis還可以將記憶體中的數據利用快照和日誌的形式保存在硬碟上,redis還提供了鍵過期,發佈訂閱,流水線等附加功能
redis重要性
1.速度快
Redis所有的數據都存放在記憶體中
Redis使用C語言實現
Redis使用單線程架構
2.基於鍵值對的數據結構伺服器
5中數據結構:字元串,哈希,列表,集合,有序集合
3.豐富的功能
提供了鍵過期功能,可以實現緩存
提供了發佈訂閱功能,可以實現消息系統
提供了pipeline功能,客戶端可以將一批命令一次性傳到Redis,減少了網路開銷
4.簡單穩定
源碼很少,3.0版本以後5萬行左右.
使用單線程模型法,是的Redis服務端處理模型變得簡單.
不依賴操作系統的中的類庫
5.客戶端語言多
java,PHP,python,C,C++,Nodejs等
6.持久化
RDB和AOF
7.主從複製
8.高可用和分散式
哨兵
集群
redis應用場景
1.緩存-鍵過期時間
緩存session會話
緩存用戶信息,找不到再去mysql查,查到然後回寫到redis
2.排行榜-列表&有序集合
熱度排名排行榜
發佈時間排行榜
3.計數器應用-天然支持計數器
帖子瀏覽數
視頻播放次數
商品瀏覽數
4.社交網路-集合
踩/贊,粉絲,共同好友/喜好,推送,打標簽
5.消息隊列系統-發佈訂閱
配合elk實現日誌收集
redis單節點安裝部署
1.目錄規劃
/data/soft/ #redis下載目錄
/opt/redis_{PORT}/{conf,logs,pid} #redis安裝目錄
/data/redis_{PORT}/redis_{PORT}.rdb #redis數據目錄
/root/scripts/redis_shell.sh #redis運維腳本
2.安裝命令
### 編輯hosts文件
[root@db01 ~]# tail -3 /etc/hosts
10.0.0.51 db01
10.0.0.52 db02
10.0.0.53 db03
###
yum install gcc -y
#make distclean && make
mkdir -p /data/soft
mkdir -p /data/redis_6379
mkdir -p /opt/redis_6379/{conf,pid,logs}
cd /data/soft/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar zxf redis-3.2.9.tar.gz -C /opt/
ln -s /opt/redis-3.2.9/ /opt/redis
cd /opt/redis
make && make install
3.配置文件
cat >/opt/redis_6379/conf/redis_6379.conf <<EOF
### 以守護進程模式啟動
daemonize yes
### 綁定的主機地址
bind 127.0.0.1 10.0.0.51
### 監聽埠
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_6379/pid/redis_6379.pid
logfile /opt/redis_6379/logs/redis_6379.log
### 設置資料庫的數量,預設資料庫為0
databases 16
### 指定本地持久化文件的文件名,預設是dump.rdb
dbfilename redis_6379.rdb
### 本地資料庫的目錄
dir /data/redis_6379
EOF
4.啟動redis
redis-server /opt/redis_6379/conf/redis_6379.conf
5.檢查是否啟動
ps -ef|grep redis
netstat -lntup|grep redis
6.進入redis
redis-cli
redis全局操作命令
0.寫入key
set k1 v1
set k2 v2
set k3 v3
1.查看所有的key!線上禁止使用!
keys *
2.查看有多少個key,註意,是估值
DBSIZE
3.查看是否存在這個KEY
EXISTS k1
EXISTS k1 k2 k3
狀態碼:
0 表示這個key不存在
1 表示這個key存在
N 表示有的N個key存在
4.刪除key(無論是什麼數據類型,都可以刪除)
DEL k1
DEL k1 k2 k3
狀態碼:
0 表示這個key不存在
1 表示這個key存在,並且刪除成功
N 表示有的N個key存在,並且刪除N個Key
5.鍵過期
設置過期時間
EXPIRE k1 100
取消過期時間,不修改key原來的值
PERSIST k1
狀態碼:
0: 表示這個key不存在
1: 表示這個key存在,並且設置過期時間成功
查看key是否過期
TTL k1
狀態碼:
-1 :這個key存在,並且永不過期
-2 :這個key不存在
N :這個key存在,並且在N秒後過期
結論:
過期後的key直接會被刪除
6.鍵的數據類型
type key
字元串操作
Redis並不是簡單地key-value存儲,實際上他是一個數據結構伺服器,支持不同類型的值.
Redis Strings
這是最簡單的Redis類型,如果你只用這種類型,Redis就像一個持久化的memcache伺服器(註:memcache的數據僅保存在記憶體中,伺服器重啟後,數據將丟失.)
操作命令:
- 通常用SET command 和 GET command來設置和獲取字元串值
- INCR命令將字元串值解析成整型.將其加1,最後結果保存為新的字元串,類似命令: INCRBY,DECR,DECRBY
- MSET和MGET可以一次存儲或獲取多個key對應的值.
- EXISTS命令返回1或0標識給定key的值是否存在.
使用DEL命令可以刪除key對應的值,
DEL命令返回1或0標識是被刪除(值存在)或者沒被刪除(key對應的值不存在). - Type命令可以返回key對應的存儲類型
- 可以對key設置一個超時時間,當這個時間到達後被刪除
- PERSIST命令去除超時時間
1.設置一個key
set k1 v1
2.查看一個key
get k1
3.設置多個key
MSET k1 v1 k2 v2 k3 v3
4.查看多個key
MGET k1 k2 k3
5.天然計數器
加1:
set k1 1
INCR k1
get k1
加N:
INCRBY k1 100
減N:
INCRBY k1 -1
減N:
INCRBY k1 -N
列表
插入列表:
LPUSH:從列表左側插入數據
RPUSH:從列表右側插入數據
最後LRANGE可以從list中取出一定範圍的元素
Pop,從list中刪除元素並同時返回刪除的值,可以在左邊或右邊操作.
LPUSH list1 A
LPUSH list1 B
LPUSH list1 C
RPUSH list1 D
查看列表的長度:
LLEN list1
查看列表的內容:
db01:6379> LRANGE list1 0 -1
1) "C"
2) "B"
3) "A"
4) "D"
刪除列表元素:
LPOP: 從列表左側刪除
RPOP: 從列表右側刪除
LPOP list1
RPOP list1
刪除列表內容:
DEL list1
哈希
Hash看起來就像一個hash的樣子.由鍵值對組成
HMSET指令設置hash中的多個域
HGET取回單個域.
HMGET取回一系列的值
生成一個hash類型:
HMSET user:1 name xiaozhang job it age 28
HMSET user:2 name abc job it age 28
HMSET user:3 name def job it age 28
查看hash里的一個值
HMGET user:1 name
查看hash里的多個值
HMGET user:1 name age job
查看hash里的所有的值
HGETALL user:1
mysql數據和redis哈希對比:
user表
uid name job age
1 xiaozhang it 28
2 xiaoya it 28
3 yazhang it 28
mysql查詢數據
select * from user where id = 3
redis緩存mysql數據
名字 key1 k1值 key2 k2的值 key3 k3的值
uid:1 name xiaozahng job it age 28
uid:2 name xiaoya job it age 28
uid:3 name yazahng job it age 28
集合
- 集合是字元串的無序排列
- SADD指令把新的元素添加到set中
- 和list類型不同,set集合不允許出現重覆的元素
- srem用來刪除指定的值
- sdiff計算後者集合的差異成員
- sinter計算集合的交集
- sunion計算集合的並集
創建集合
db01:6379> SADD set1 1 2 3
(integer) 3
db01:6379> SADD set2 1 3 5 7
(integer) 4
查看集合的成員:
db01:6379> SMEMBERS set1
1) "1"
2) "2"
3) "3"
db01:6379> SMEMBERS set2
1) "1"
2) "3"
3) "5"
4) "7"
db01:6379> srem set1 2 4
(integer) 2
db01:6379> smembers set1
1) "1"
2) "3"
查看集合的差集,以前面一個集合為基準對比後面的,前面有,後面沒有則選出來
db01:6379> SDIFF set1 set2
1) "2"
db01:6379> SDIFF set2 set1
1) "7"
查看集合的交集
db01:6379> SINTER set1 set2
1) "1"
2) "3"
3) "5"
查看集合的並集
db01:6379> SUNION set1 set2
1) "1"
2) "2"
3) "3"
4) "5"
5) "7"
db01:6379> SUNION set1 set2 set3
1) "1"
2) "2"
3) "3"
4) "5"
5) "7"
6) "9"
有序集合添加成員
zadd key score member [score member]
zadd linux5 100 banzhang
zadd linux5 99 xuewei 10 zuzhang 150 mage
計算成員個數
zcard linux5
計算某個成員分數
zscore key member
zscore linux5 banzhang
計算成員排名
zrank key member
zrevrank key member
升序排行 zrank linux5 xuewei
降序排行 zrevrank linux5 xuewei
刪除成員
zrem key member
zrem user:ranking oldzhang
增加成員分數
zincrby key increment member
zincrby linux5 1 xuewei
返回指定排名範圍的成員
升序 zrang key start end [wishscores]
降序 zrevrange key start end [wishscores]
127.0.0.1:6379> ZRANGE linux5 0 -1 withscores
1) "c"
2) "10"
3) "b"
4) "99"
5) "a"
6) "100"
7) "d"
8) "150"
127.0.0.1:6379> ZREVRANGE linux5 0 -1 withscores
1) "d"
2) "150"
3) "a"
4) "100"
5) "b"
6) "99"
7) "c"
8) "10"
返回指定分數範圍的成員
zrangebyscore key min max [wishscores] [limit offect count]
zrevrangebyscore key max min [wishscores] [limit offect count]
zrangebyscore linux5 100 200 withscores
ZREVRANGEBYSCORE linux5 200 99 withscores
返回指定分數範圍成員個數
zount key min max
zcount linux5 100 200
systemd管理redis
cat >/lib/systemd/system/redis.service <<EOF
[Unit]
Description=Redis
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /opt/redis_6379/conf/redis_6379.conf --daemonize yes
ExecStop=/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF