redis初識

redis介紹

redis是什麼

redis是一種基於鍵值對的NOsql數據庫,與不少鍵值對數據庫不一樣,redis中的值string,hash,list,set,zset,geo等多種數據機構和算法組成,由於redis會將全部的數據都放在內存中,因此他的讀寫性能很是驚人,不只如此,redis還能夠將內存中的數據利用快照和日誌的形式保存在硬盤上,redis還提供了鍵過時,發佈訂閱,流水線等附加功能css

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的數據僅保存在內存中,服務器重啓後,數據將丟失.)
操做命令:java

  • 一般用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
相關文章
相關標籤/搜索