你們好,我是深度Linux,本系列專欄是對 Redis 的入門以及進階使用,但願對你們有所幫助。redis
(1)介紹數據庫
首先來看下redis 官網,若是感受看着吃力,也有國人翻譯的中文版本redis 中文網站。下面來看一下網站對Redis的介紹。編程
Redis 是一個開源(BSD 許可)的,內存中的數據結構存儲系統,它能夠用做數據庫、緩存和消息中間件。 它支持多種類型的數據結構,如字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內置了複製(replication),LUA 腳本(Lua scripting), LRU 驅動事件(LRU eviction),事務(transactions) 和不一樣級別的 磁盤持久化(persistence), 並經過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。若是看了還感受莫名其妙,不要緊。簡單來講Redis是一種基於鍵值(Key-Value)的高性能內存數據庫。它提供了一些有用且方便的數據結構,好比Value能夠string、hash、list、set、zset,因爲這種結構的存在,咱們平時的開發中就能夠靈活的應用這些結構優化咱們的技術實現。同時Redis還提供了鍵過時,發佈訂閱,事務,流水線等其它附加功能。若是看到這裏你還沒明白,不要緊,接下來我將一點一點揭開它神祕的面紗。讓你真正作到從入門到奪門而出。
(2)特性
若是有人問你,你用過Redis,那它有什麼特性呢,下面的答案請務必記住(固然了,記性很差的譬如我記住幾條關鍵的也可)。來看一下答案:centos
(3)使用場景
那何時能夠考慮使用呢?何時能夠用而不是故意炫技呢?來看一下目前常見的使用狀況:緩存
(4)安裝
Redis支持Windows和Linux,若是隻是本身玩玩,能夠直接使用Windows版本,很是的簡單和快速就能啓動。這裏就不給出Windows環境下的安裝包了,網上一搜處處都是。下面主要說明下Linux環境下的安裝與基本配置(固然了,只是以啓動服務客戶端能夠鏈接爲目的的簡單配置)
以centos7舉例:
一、依賴檢查網絡
yum install cpp -y yum install binutils -y yum install glibc-kernheaders -y yum install glibc-common -y yum install glibc-devel -y yum install gcc -y yum install make -y
二、下載編譯安裝包數據結構
cd /usr/local mkdir soft cd soft wget http://download.redis.io/releases/redis-4.0.6.tar.gz tar xzf redis-4.0.6.tar.gz cd redis-4.0.6 make mkdir /usr/local/redis cp redis-server /usr/local/redis cp redis-benchmark /usr/local/redis cp redis-check-rdb /usr/local/redis cp redis-sentinel /usr/local/redis cp redis-cli /usr/local/redis cp redis.conf /usr/local/redis
通常須要設置密碼,注意修改redis.conf文件 修改 requirepass 123456789 ,而且修改bind 127.0.0.1爲本機的外網 IP,不然沒法經過遠程機器鏈接。
啓動: ./redis-server redis.conf &
使用客戶端鏈接: ./redis-cli -h 192.168.9.100 -p 6379 -a 123456789多線程
這裏也來介紹下 Redis 常見的數據結構,方便你們使用。架構
刪庫跑路操做flushall,清空全部值。分佈式
(1)經常使用操做
# 設置 key 爲 name,value 爲 pleuvoir 的字符串,而且10秒後過時 set name pleuvoir ex 10 # 查看 key = name 的過時時間 ttl name # 查看 key = name 的值 get name # set nx 若是沒有則設置,不然不操做(分佈式鎖經常使用) setnx name pleuvoir
批量設值,減小 IO,原子性
mset country china city bj mget country city
自增/減操做
# 第一次沒有值會爲 1incr age #得到的值爲 1get age # 減操做,一直減的話是能夠變爲負數的 # decr age # 按照指定的區間,每次加10 incrby age 10 # 按照浮點型,incr 只能針對整型 incrfloat score 1.1
哈希操做
#設置 hmset user:1 name pleuvoir age 18 #獲取 hgetall user:1
簡單來講就是一個 key 對應的值是多個有序的字符串。對應到Java中以下:
List<String> users = new ArrayList(); users.add("pleuvoir"); users.add("realtrump"); users.add("jack");
固然,它的操做仍是比較多的,爲了方便理解,我畫了個圖。
由於有序,因此按照下標獲取天然是支持的。請注意:一個列表最多能夠儲存2^32-1個元素。下面演示下列表命令。
# 從右向左插入 返回3 rpush users pleuvoir realtrump jack # 查找全部元素 lrange users 0 -1 # 返回當前列表長度 llen users # 彈出最左邊元素 lpop users
保存多元素,不容許有重複值,而且無序。只能保存2^32-1個元素。除此以外,能夠求交集、並集、差集。能夠利用此特性完成一些應用上的需求。使用方式以下:
# 插入 sadd language chinese english # 若再次插入則忽略重複 sadd language chinese english # 查看所有(結果無序) smembers language # 刪除某個元素 srem language chinese # 查看當前元素個數 scard language
另外,因爲能夠計算交集的特性,在實際的應用中好比能夠獲得兩我的相同的愛好。
# 小明喜歡的顏色 sadd color:xiaoming red blue green # 小紅喜歡的顏色 sadd color:xiaohong red blue # 計算他們共同喜歡的顏色 sinter color:xiaoming color:xiaohong
經常使用作排行榜。具體和集合的區別是,每一個元素多了一個打分。這樣能夠按照評分來進行排序。
如下組數據進行舉例,看看是如何經過命令完成操做的,咱們暫且認爲這是點贊排行榜,key 爲good_ranks
# 初始化點贊數據zadd good_ranks 20 xiaoming 300 xiaohong 1 xiaowang # 查看分數與成員zrange good_ranks 0 -1 withscores 能夠看出,默認分數是從小到達排序的。 # 返回xiaoming的名次,正向排序。返回1 下標從0開始,是第二名 zrank good_ranks xiaoming # 返回xiaowang的名次,反向排序。他排在最上面,反向則返回2 zrevrank good_ranks xiaowang
這裏只是簡單的列舉了幾種場景,下面舉個實際的例子在應用中如何保存對象信息。
7、場景舉例
假設咱們的需求是保存用戶信息,那麼該選取何種數據結構,而且它們有什麼優缺點?
如今有一個對象:
User user = new user(); user.setName("pleuvoir"); user.setAge(18); 使用哈希結構 hmset user:1 name pleuvoir age 18
優勢:簡單直接,每一個 key 對應一個 value。缺點:哈希結構佔用內存大,而且最大保存512M。
2.使用序列化
這裏有兩種狀況,一種是使用字符串形式,另一種是使用序列化工具如ProtoBuf以二進制的形式存儲。
字符串形式:
set user {"name":"pleuvoir","age":18}
二進制形式就不作展現了,若使用合理能夠節約內存,可是若是使用一些圖形化工具查看,可能看的不是很清楚。
這兩種序列化的方式共同的缺點是:修改一個屬性,修改反序列化整個對象,設置完值之後再序列化保存到Redis這個成本仍是比較大的。優勢是:編程簡單。
# 查看全部Key,線上謹慎操做 keys * # 檢查是否存在 exists [key] # 設置過時時間 expire [key] [seconds] # 查看過時時間 ttl [key] # 查看鍵的數據類型 type [key]