Redis內(nèi)存數(shù)據(jù)庫
背景
隨著互聯(lián)網(wǎng)+大數(shù)據(jù)時代的來臨斑响,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫已經(jīng)不能滿足中大型網(wǎng)站日益增長的訪問量和數(shù)據(jù)量本冲。這個時候就需要一種能夠快速存取數(shù)據(jù)的組件來緩解數(shù)據(jù)庫服務(wù)I/O的壓力乃正,來解決系統(tǒng)性能上的瓶頸伞广。
數(shù)據(jù)庫的發(fā)展歷史
1.在互聯(lián)網(wǎng)+大數(shù)據(jù)時代來臨之前稳其,企業(yè)的一些內(nèi)部信息管理系統(tǒng)换衬,一個單個數(shù)據(jù)庫實例就能滿足系統(tǒng)的需求
單數(shù)據(jù)庫實例
2.隨著系統(tǒng)訪問用戶的增多,數(shù)據(jù)量的增大亡蓉,單個數(shù)據(jù)庫實例已經(jīng)滿足不了系統(tǒng)的讀取需求
緩存(memcache)+單數(shù)據(jù)庫實例
3.緩存可以緩解系統(tǒng)的讀取壓力晕翠,但是數(shù)據(jù)量的寫入壓力持續(xù)增大,
緩存+主從數(shù)據(jù)庫+讀寫分離
4.數(shù)據(jù)量再次增大,讀寫分離以后淋肾,主數(shù)據(jù)庫的寫庫壓力出現(xiàn)瓶頸硫麻、
緩存+主從數(shù)據(jù)庫集群+讀寫分離+分庫分表
5.互聯(lián)網(wǎng)+大數(shù)據(jù)時代來臨,關(guān)系型數(shù)據(jù)庫不能很好的存取一些并發(fā)性高樊卓,實時性高的拿愧,并且數(shù)據(jù)格式不固定的數(shù)據(jù)。
nosql+主從數(shù)據(jù)庫集群+讀寫分離+分庫分表
Redis是什么碌尔?
Redis是一個高性能的浇辜,開源的,C語言開發(fā)的唾戚,鍵值對存儲數(shù)據(jù)的nosql數(shù)據(jù)庫柳洋。
NoSQL:not only sql,泛指非關(guān)系型數(shù)據(jù)庫 Redis/MongoDB/Hbase Hadoop
關(guān)系型數(shù)據(jù)庫:MySQL叹坦、oracle熊镣、SqlServer
Redis特性
- Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中立由,重啟的時候可以再次加載進(jìn)行使用
- Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時還提供List序厉,set等數(shù)據(jù)類型
- Redis支持?jǐn)?shù)據(jù)的備份
Redis有什么用锐膜?
Redis的主要作用:快速存取
Redis應(yīng)用場景
點贊/秒殺/直播平臺的在線好友列表/商品排行榜/單點登錄
Redis怎么用?
官網(wǎng)地址:https://redis.io/
命令地址:http://doc.redisfans.com/
應(yīng)用版本:3.0.4
Redis的五大數(shù)據(jù)類型以及應(yīng)用場景
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
后臺啟動
redis-server &
打開服務(wù)
sudo service redis start
關(guān)閉服務(wù)
sudo service redis stop
Redis的配置文件
/etc/redis/redis.conf
當(dāng)redis作為守護(hù)進(jìn)程運行的時候弛房,它會寫一個 pid 到 /var/run/redis.pid 文件里面道盏。
daemonize no
監(jiān)聽端口號,默認(rèn)為 6379文捶,如果你設(shè)為 0 荷逞,redis 將不在 socket 上監(jiān)聽任何客戶端連接。
port 6379
設(shè)置數(shù)據(jù)庫的數(shù)目粹排。
databases 16
根據(jù)給定的時間間隔和寫入次數(shù)將數(shù)據(jù)保存到磁盤
下面的例子的意思是:
900 秒內(nèi)如果至少有 1 個 key 的值變化种远,則保存
300 秒內(nèi)如果至少有 10 個 key 的值變化,則保存
60 秒內(nèi)如果至少有 10000 個 key 的值變化顽耳,則保存
save 900 1
save 300 10
save 60 10000
監(jiān)聽端口號坠敷,默認(rèn)為 6379,如果你設(shè)為 0 射富,redis 將不在 socket 上監(jiān)聽任何客戶端連接膝迎。
port 6379
Redis默認(rèn)只允許本地連接,不允許其他機器連接
bind 127.0.0.1
更多配置文件:https://www.cnblogs.com/kreo/p/4423362.html
Redis數(shù)據(jù)庫簡單使用
redis是分布式的內(nèi)存數(shù)據(jù)庫
/usr/bin/redis-benchmark
文件可以測試機器性能
redis讀取速度每秒能達(dá)到10W左右
切換數(shù)據(jù)庫 select 數(shù)據(jù)庫號
DBSIZE 查看當(dāng)前數(shù)據(jù)庫的key數(shù)量
keys * 查看key的內(nèi)容
FLUSHDB 清空當(dāng)前數(shù)據(jù)庫的key的數(shù)量
FLUSHALL 清空所有庫的key(慎用)
exists key 判斷key是否存在
redis常用五大數(shù)據(jù)類型
redis-key
1.key * 查看所有key
2.exists key 的名字 判斷key是否存在
如果存在返回1 不存在返回0
命令:exists k1
3.move key db 當(dāng)前庫沒有了 被移除了 移動到指定庫中
命令:move k1 2 移動k1 到2號庫
4.expire key 秒數(shù) 過多少秒刪除
5.ttl time to live -1表示永不過期 -2表示已過期
命令:ttl k1
6.type key 查看你的key是什么類型
命令:type k1 返回 string
1.redis-string
1.string(字符串)
string是redis最基本的類型胰耗,一個key對應(yīng)一個value
string可以包含任何數(shù)據(jù)限次,最大不能超過512M
1.set/get/del/append/strlen
set ---- 設(shè)置值
get ---- 獲取值
mset ---- 設(shè)置多個值
mget ---- 獲取多個值
append ---- 添加字段
del ---- 刪除
strlen ---- 返回字符串長度
2.incr/decr/incrby/decrby
incr ---- 增加
decr ---- 減少
incrby ----- 制定增加多少
decrby ----- 制定減少多少
set k1 26
incr k1 返回27 遞增加1
decr k1 返回26 遞減減1
incrby k1 2 返回28
decrby k1 2 返回26
set k3 v3
incr k3 會報錯!柴灯!增加不能增加字符串
3.getrange/setrange
getrange ---- 獲取指定區(qū)間范圍內(nèi)的值,類似between....and的關(guān)系
setrange ---- 代表從第幾位開始替換,下腳本從零開始
從0 -1表示全部
set k1 juran123
getrange k1 0 -1 返回 "juran123"
getrange k1 0 2 返回 jur
setrange k1 0 xxx 返回 "xxxan123"
2.redis-list(單值多value)
List(列表)
列表是簡單的字符串列表卖漫,按照插入順序排序费尽,可以添加一個元素列表的頭部(左邊)或者尾部(右邊)
它的底層實際是個鏈表
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,按照索引下標(biāo)獲得元素(從上到下)
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結(jié)束index,截取指定范圍的值后在賦值給key
ltrim list01 0 2 截取list01 從0到2的數(shù)據(jù)在賦值給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是一個鍵值對集合
hash是一個string類型的field和value的映射表懊亡,hash特別適合存儲對象
KV模式不變依啰,但V是一個鍵值對
1.hset/hget/hmset/hmget/hgetall/hdel
設(shè)值/取值/設(shè)值多個值/取多個值/取全部值/刪除值
hset user id 11
hget user id
hmset customer id 11 name juran age 26
hmget customer id name age 只返回相應(yīng)的值
hgetall customer 返回全部
hdel user id 刪除id
2.hlen
求哈希長度
hlen customer
3.hexists key
hexists ---- 在key里面的某個值
存在返回1 ,不存在返回0
4.hkeys/hvals
hkeys students
hvals students
5.hincrby/hincrbyfloat
小數(shù)
4.redis-set(不重復(fù)的)
Set(集合)
set是string類型的無序集合
1.sadd/smembers/sismember
sadd/smembers/sismember ---- 添加/查看集合/查看是否存在
sadd set01 1 2 2 3 3 去掉重復(fù)添加
smembers set01 得到set01
sismember set01 1 如果存在返回1 不存在返回0
2.scard
scard ---- 獲取集合里面的元素個數(shù)
scard set01
3.srem key value
srem ---- 刪除集合中元素
srem set01 3
SMEMBERS set01 3已經(jīng)被刪除掉
4.srandmember key
srandmembe ---- 隨機出幾個數(shù)
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.數(shù)學(xué)集合類
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 中的值 去掉重復(fù)
5.redis-Zset
Zset(有序集合)
1.zadd/zrange
zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5
zrange zset01 0 -1
帶分?jǐn)?shù)返回 withscores
2.zrangebyscore key start end
zrangebyscore key start end----根據(jù)開始結(jié)束來取值
zrangebyscore zset01 60 70
zrangebyscore zset01 60 (90 表示不包含90
zrangebyscore zset01 60 90 limit 1 2 從第一條開始截取2條
3.zrem key
zrem key value---- 某score下對應(yīng)的value值,作用是刪除元素
zrem zset01 v1
4.zcard/zcount key score 區(qū)間/zrank key values
zcard 求zset01 總條數(shù)
zcount zset01 60 90 求60-90個數(shù)
zrank zset01 v2 返回1 返回對應(yīng)下角標(biāo)店枣,從0開始