
*****
## Redis內存數據庫
### 背景
隨著互聯網+大數據時代的來臨,傳統的關系型數據庫已經不能滿足中大型網站日益增長的訪問量和數據量。這個時候就需要一種能夠快速存取數據的組件來緩解數據庫服務I/O的壓力,來解決系統性能上的瓶頸。
### 數據庫的發展歷史
1.在互聯網+大數據時代來臨之前,企業的一些內部信息管理系統,一個單個數據庫實例就能滿足系統的需求
單數據庫實例
<br>2.隨著系統訪問用戶的增多,數據量的增大,單個數據庫實例已經滿足不了系統的讀取需求
緩存(memcache)+單數據庫實例
<br>3.緩存可以緩解系統的讀取壓力,但是數據量的寫入壓力持續增大,
緩存+主從數據庫+讀寫分離
<br>4.數據量再次增大,讀寫分離以后,主數據庫的寫庫壓力出現瓶頸、
緩存+主從數據庫集群+讀寫分離+分庫分表
<br>5.互聯網+大數據時代來臨,關系型數據庫不能很好的存取一些并發性高,實時性高的,并且數據格式不固定的數據。
nosql+主從數據庫集群+讀寫分離+分庫分表
### Redis是什么?
Redis是一個高性能的,開源的,C語言開發的,鍵值對存儲數據的nosql數據庫。
<br>NoSQL:not only sql,泛指非關系型數據庫 Redis/MongoDB/Hbase Hadoop
<br>關系型數據庫:MySQL、oracle、SqlServer
### Redis特性
- Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用
- Redis不僅僅支持簡單的key-value類型的數據,同時還提供List,set等數據類型
- Redis支持數據的備份
### Redis有什么用?
Redis的主要作用:快速存取
### Redis應用場景
點贊/秒殺/直播平臺的在線好友列表/商品排行榜/單點登錄
### Redis怎么用?
官網地址:https://redis.io/
命令地址:http://doc.redisfans.com/
Redis的五大數據類型以及應用場景
```
string/list/set/hash/zset
```
### Redis的安裝及啟動
```
sudo apt-get install redis-server
查看幫助命令
redis-server --help
編輯Redis配置文件
sudo vim /etc/redis/redis.conf
將daemonize no改為 daemonize yes保存退出
啟動
redis-server
打開服務
sudo service redis start
關閉服務
sudo service redis stop
```
### Redis的配置文件
```
/etc/redis/redis.conf
當redis作為守護進程運行的時候,它會寫一個 pid 到 /var/run/redis.pid 文件里面。
daemonize no
監聽端口號,默認為 6379,如果你設為 0 ,redis 將不在 socket 上監聽任何客戶端連接。
port 6379
設置數據庫的數目。
databases 16
根據給定的時間間隔和寫入次數將數據保存到磁盤
下面的例子的意思是:
900 秒內如果至少有 1 個 key 的值變化,則保存
300 秒內如果至少有 10 個 key 的值變化,則保存
60 秒內如果至少有 10000 個 key 的值變化,則保存
save 900 1
save 300 10
save 60 10000
監聽端口號,默認為 6379,如果你設為 0 ,redis 將不在 socket 上監聽任何客戶端連接。
port 6379
Redis默認只允許本地連接,不允許其他機器連接
bind 127.0.0.1
```
更多配置文件:https://www.cnblogs.com/kreo/p/4423362.html
### Redis數據庫簡單使用
```
DBSIZE 查看當前數據庫的key數量
keys * 查看key的內容
FLUSHDB 清空當前數據庫的key的數量
FLUSHALL 清空所有庫的key(慎用)
exists key 判斷key是否存在
```
## redis常用五大數據類型
### 1.redis-string
string是redis最基本的類型,一個key對應一個value

string可以包含任何數據,最大不能超過512M
<br>1.set/get/del/append/strlen
```
set ---- 設置值
get ---- 獲取值
mset ---- 設置多個值
mget ---- 獲取多個值
append ---- 添加字段
del ---- 刪除
strlen ---- 返回字符串長度
```
2.incr/decr/incrby/decrby
```
incr ---- 增加
decr ---- 減少
incrby ----- 制定增加多少
decrby ----- 制定減少多少
```
3.getrange/setrange
```
getrange ---- 獲取指定區間范圍內的值,類似between....and的關系
setrange ---- 代表從第幾位開始替換,下腳本從零開始
從0 -1表示全部
```
### 2.redis-list(單值多value)
List(列表)
列表是簡單的字符串列表,按照插入順序排序,可以添加一個元素列表的頭部(左邊)或者尾部(右邊)
它的底層實際是個鏈表
<br>1.lpush/rpush/lrange
```
lpush/rpush/lrange ---- 從左/從右/獲取指定長度
lpush list01 1 2 3 4 5 倒序排列
rpush list02 1 2 3 4 5 正序排列
lrange list01 0 -1 獲取list01 中的所有值
```
2.lpop/rpop
```
lpop/rpop ---- 移除最左/最右
lpop list01 刪除元素5
rpop list01 刪除元素1
```
3.lindex,按照索引下標獲得元素(從上到下)
```
lrange list01 0 -1
lindex list01 1
```
4.llen,求列表長度
```
llen list01
```
5.lrem key
```
刪N個value
lrem list01 2 1 在list01中刪除2個1
```
6.ltrim key
```
ltrim ---- 開始index結束index,截取指定范圍的值后在賦值給key
ltrim list01 0 2 截取list01 從0到2的數據在賦值給list01
```
7.rpoplpush list1 list2 將list1中最后一個壓入list2中第一位
```
lrange list01 0 -1
lrange list02 0 -1
rpoplpush list1 list2
```
8.lset key index value
```
lset list01 0 x 將list02中第一位換成x
```
9.linsert key before/after
```
linsert list01b before x php 在x之前加字段php
```
### 3.redis-Hash
hash是一個鍵值對集合
hash是一個string類型的field和value的映射表,hash特別適合存儲對象
<br>1.hset/hget/hmset/hmget/hgetall/hdel
```
設值/取值/設值多個值/取多個值/取全部值/刪除值
hset user id 11
hget user id
hmset customer id 11 name juran age 26
hmget customer id name age 只返回相應的值
hgetall customer 返回全部
hdel user id 刪除id
```
2.hlen
```
求哈希長度
hlen customer
```
3.hexists key
```
hexists ---- 在key里面的某個值
存在返回1 ,不存在返回0
```
4.hkeys/hvals
```
hkeys students
hvals students
```
### 4.redis-set(不重復的)
Set(集合)
set是string類型的無序集合
<br>1.sadd/smembers/sismember
```
sadd/smembers/sismember ---- 添加/查看集合/查看是否存在
sadd set01 1 2 2 3 3 去掉重復添加
smembers set01 得到set01
sismember set01 1 如果存在返回1 不存在返回0
```
2.scard
```
scard ---- 獲取集合里面的元素個數
scard set01
```
3.srem key value
```
srem ---- 刪除集合中元素
srem set01 3
SMEMBERS set01 3已經被刪除掉
```
4.srandmember key
```
srandmembe ---- 隨機出幾個數
sadd set02 1 2 3 4 5 6 7 8
srandmember set02 2
```
5.spop key
```
spop ---- 隨機出棧
spop set01
```
6.smove key1 key2
```
sadd set03 x y z
smove set01 set03 2 將set01中的2 移動到set03中
```
7.數學集合類
```
sadd set01 1 2 3 4 5
sadd set02 1 2 3 a b
差集
SDIFF set01 set02 返回 4 5 在第一個set中不在第二個set中
交集
SINTER set01 set02 返回 1 2 3
并集
SUNION set01 set02 返回set01 set02 中的值 去掉重復
```
#### 5.redis-Zset
Zset(有序集合)
1.zadd/zrange
```
zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5
zrange zset01 0 -1
帶分數返回 withscores
```
2.zrangebyscore key start end
```
zrangebyscore key start end----根據開始結束來取值
zrangebyscore zset01 60 70
zrangebyscore zset01 60 (90 表示不包含90
zrangebyscore zset01 60 90 limit 1 2 從第一條開始截取2條
```
3.zrem key
```
zrem key value---- 某score下對應的value值,作用是刪除元素
zrem zset01 v1
```
4.zcard/zcount key score 區間/zrank key values
```
zcard 求zset01 總條數
zcount zset01 60 90 求60-90個數
zrank zset01 v2 返回1 返回對應下角標,從0開始
```