redis从入门到实践
生活随笔
收集整理的這篇文章主要介紹了
redis从入门到实践
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一. Redis安裝使用
1.介紹
redis是一個key-value存儲系統(tǒng)。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set--有序集合)和hash(哈希類型)。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實現(xiàn)了master-slave(主從)同步。2.安裝redis
1.下載官網(wǎng)最新redis安裝包
http://download.redis.io/releases/redis-4.0.0.tar.gz2.在/usr/local下創(chuàng)建文件redis
cd /usr/local mkdir redis3.將下載的redis-4.0.2.tar.gz安裝包解壓到redis文件夾中
cd ~ tar -zxvf redis-4.0.2.tar.gz -C /usr/local/redis4.進入解壓后的目錄進行編譯
cd /usr/local/redis/redis-4.0.2 make5.安裝到指定目錄,如 /usr/local/redis
cd /usr/local/redis/redis-4.0.2 make PREFIX=/usr/local/redis install6.拷貝配置文件redis.conf到安裝目錄下
cp /usr/local/redis/redis-4.0.2/redis.conf /usr/local/redis/bin7.修改redis.conf配置文件,這里使用默認端口6379,有需要的可以更改。 把daemonize改為yes(這里推薦以后端模式啟動)
vi /usr/local/redis/bin/redis.conf-----------------------------------以后端模式啟動redis cd /usr/local/redis ./bin/redis-server ./bin/redis.conf8.測試redis
cd /usr/local/redis ./bin/redis-cli set name zhangsan get name9.Linux開啟關(guān)閉redis
1.啟動:./redis-server(redis-server redis.conf)2.登陸:./redis-cli(redis-cli -p 6379)3.關(guān)閉:./redis-cli shutdown10.Linux 為redis配置密碼
1.第一種方式(臨時密碼,Linux重啟后會消失) (1) [root@localhost bin]# redis-cli -p 6379 127.0.0.1:6379> (2)查看當前redis有沒有設(shè)置密碼: 127.0.0.1:6379> config get requirepass 1) "requirepass" 2) "" (3)為以上顯示說明沒有密碼,那么現(xiàn)在來設(shè)置密碼: 127.0.0.1:6379> config set requirepass abcdefg OK 127.0.0.1:6379> (4)再次查看當前redis就提示需要密碼: 127.0.0.1:6379> config get requirepass (error) NOAUTH Authentication required. 127.0.0.1:6379>2.第二種方式 (永久方式) 需要永久配置密碼的話就去redis.conf的配置文件中找到requirepass這個參數(shù),如下配置: 修改redis.conf配置文件 # requirepass foobared requirepass 123 指定密碼123 保存后重啟redis就可以了11.Jedis連接redis
java 代碼方式 //連接redis服務(wù)器,192.168.0.100:6379 jedis = new Jedis("ip", 6379); //權(quán)限認證 jedis.auth("password");配置文件方式 <bean id=”jedisConnectionFactory” class=”org.springframework.data.redis.connection.jedis.JedisConnectionFactory”> <property name=”hostName” value=”${redis.host}” /> <property name=”port” value=”${redis.port}” /> <property name=”password” value=”${redis.pass}” /> </bean>redis的其他命令 如果需要關(guān)閉redis: [root@localhost bin]# pkill redis 如果需要開啟redis: [root@localhost bin]# redis-server & 加&符號的作用是為了讓此進程轉(zhuǎn)換為后臺進程,不占用shell的服務(wù)。注意事項
1.提示time out錯誤 需要在iptables防火墻上添加6379端口并重啟防火墻服務(wù) 2.提示connection refuse錯誤 需要注釋掉redis.conf 文件中的bind 127.0.0.1 3.提示J edisDataException錯誤 需要將redis.conf文件中的protect-mode 置為no最后重啟redis應(yīng)用場景
1.緩存 2.聊天室,秒殺,任務(wù)隊列(list結(jié)構(gòu),pop(彈出),push(插入)) 3.數(shù)據(jù)存儲(add,del,update,select)定期持久化到硬盤中 4.網(wǎng)站統(tǒng)計 5.數(shù)據(jù)過期處理 6.分布式集群架構(gòu)中的session分離主要內(nèi)容
NoSQL(非關(guān)系型數(shù)據(jù)庫) redis:key/value鍵值dui存儲數(shù)據(jù)庫 mongodb:文檔型數(shù)據(jù)庫 hbase:列式數(shù)據(jù)庫 neo4j:圖式數(shù)據(jù)庫,存儲的是圖關(guān)系而非行或列。主要用于社交網(wǎng)絡(luò)的存儲redis數(shù)據(jù)結(jié)構(gòu):String Hash Set SortedSet List redis事務(wù):multi exec discard redis持久化:rbd內(nèi)存快照,aof命令日志二.Redis快速入門
1.redis 配置說明
1\. Redis默認不是以守護進程的方式運行,可以通過該配置項修改,使用yes啟用守護進程 daemonize no 2\. 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定 pidfile /var/run/redis.pid 3\. 指定Redis監(jiān)聽端口,默認端口為6379,作者在自己的一篇博文中解釋了為什么選用6379作為默認端口,因為6379在手機按鍵上MERZ對應(yīng)的號碼,而MERZ取自意大利歌女Alessia Merz的名字 port 6379 4\. 綁定的主機地址 bind 127.0.0.1 5.當 客戶端閑置多長時間后關(guān)閉連接,如果指定為0,表示關(guān)閉該功能 timeout 300 6\. 指定日志記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認為verbose loglevel verbose 7\. 日志記錄方式,默認為標準輸出,如果配置Redis為守護進程方式運行,而這里又配置為日志記錄方式為標準輸出,則日志將會發(fā)送給/dev/null logfile stdout 8\. 設(shè)置數(shù)據(jù)庫的數(shù)量,默認數(shù)據(jù)庫為0,可以使用SELECT <dbid>命令在連接上指定數(shù)據(jù)庫id databases 16 9\. 指定在多長時間內(nèi),有多少次更新操作,就將數(shù)據(jù)同步到數(shù)據(jù)文件,可以多個條件配合 save <seconds> <changes> Redis默認配置文件中提供了三個條件: save 900 1 save 300 10 save 60 10000 分別表示900秒(15分鐘)內(nèi)有1個更改,300秒(5分鐘)內(nèi)有10個更改以及60秒內(nèi)有10000個更改。 10\. 指定存儲至本地數(shù)據(jù)庫時是否壓縮數(shù)據(jù),默認為yes,Redis采用LZF壓縮,如果為了節(jié)省CPU時間,可以關(guān)閉該選項,但會導(dǎo)致數(shù)據(jù)庫文件變的巨大 rdbcompression yes 11\. 指定本地數(shù)據(jù)庫文件名,默認值為dump.rdb dbfilename dump.rdb 12\. 指定本地數(shù)據(jù)庫存放目錄 dir ./ 13\. 設(shè)置當本機為slav服務(wù)時,設(shè)置master服務(wù)的IP地址及端口,在Redis啟動時,它會自動從master進行數(shù)據(jù)同步 slaveof <masterip> <masterport> 14\. 當master服務(wù)設(shè)置了密碼保護時,slav服務(wù)連接master的密碼 masterauth <master-password> 15\. 設(shè)置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時需要通過AUTH <password>命令提供密碼,默認關(guān)閉 requirepass foobared 16\. 設(shè)置同一時間最大客戶端連接數(shù),默認無限制,Redis可以同時打開的客戶端連接數(shù)為Redis進程可以打開的最大文件描述符數(shù),如果設(shè)置 maxclients 0,表示不作限制。當客戶端連接數(shù)到達限制時,Redis會關(guān)閉新的連接并向客戶端返回max number of clients reached錯誤信息 maxclients 128 17\. 指定Redis最大內(nèi)存限制,Redis在啟動時會把數(shù)據(jù)加載到內(nèi)存中,達到最大內(nèi)存后,Redis會先嘗試清除已到期或即將到期的Key,當此方法處理 后,仍然到達最大內(nèi)存設(shè)置,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放內(nèi)存,Value會存放在swap區(qū) maxmemory <bytes> 18\. 指定是否在每次更新操作后進行日志記錄,Redis在默認情況下是異步的把數(shù)據(jù)寫入磁盤,如果不開啟,可能會在斷電時導(dǎo)致一段時間內(nèi)的數(shù)據(jù)丟失。因為 redis本身同步數(shù)據(jù)文件是按上面save條件來同步的,所以有的數(shù)據(jù)會在一段時間內(nèi)只存在于內(nèi)存中。默認為no appendonly no 19\. 指定更新日志文件名,默認為appendonly.aof appendfilename appendonly.aof 20\. 指定更新日志條件,共有3個可選值: no:表示等操作系統(tǒng)進行數(shù)據(jù)緩存同步到磁盤(快) always:表示每次更新操作后手動調(diào)用fsync()將數(shù)據(jù)寫到磁盤(慢,安全) everysec:表示每秒同步一次(折衷,默認值) appendfsync everysec 21\. 指定是否啟用虛擬內(nèi)存機制,默認值為no,簡單的介紹一下,VM機制將數(shù)據(jù)分頁存放,由Redis將訪問量較少的頁即冷數(shù)據(jù)swap到磁盤上,訪問多的頁面由磁盤自動換出到內(nèi)存中(在后面的文章我會仔細分析Redis的VM機制) vm-enabled no 22\. 虛擬內(nèi)存文件路徑,默認值為/tmp/redis.swap,不可多個Redis實例共享 vm-swap-file /tmp/redis.swap 23\. 將所有大于vm-max-memory的數(shù)據(jù)存入虛擬內(nèi)存,無論vm-max-memory設(shè)置多小,所有索引數(shù)據(jù)都是內(nèi)存存儲的(Redis的索引數(shù)據(jù) 就是keys),也就是說,當vm-max-memory設(shè)置為0的時候,其實是所有value都存在于磁盤。默認值為0 vm-max-memory 0 24\. Redis swap文件分成了很多的page,一個對象可以保存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據(jù)存儲的 數(shù)據(jù)大小來設(shè)定的,作者建議如果存儲很多小對象,page大小最好設(shè)置為32或者64bytes;如果存儲很大大對象,則可以使用更大的page,如果不 確定,就使用默認值 vm-page-size 32 25\. 設(shè)置swap文件中的page數(shù)量,由于頁表(一種表示頁面空閑或使用的bitmap)是在放在內(nèi)存中的,,在磁盤上每8個pages將消耗1byte的內(nèi)存。 vm-pages 134217728 26\. 設(shè)置訪問swap文件的線程數(shù),最好不要超過機器的核數(shù),如果設(shè)置為0,那么所有對swap文件的操作都是串行的,可能會造成比較長時間的延遲。默認值為4 vm-max-threads 4 27\. 設(shè)置在向客戶端應(yīng)答時,是否把較小的包合并為一個包發(fā)送,默認為開啟 glueoutputbuf yes 28\. 指定在超過一定的數(shù)量或者最大的元素超過某一臨界值時,采用一種特殊的哈希算法 hash-max-zipmap-entries 64 hash-max-zipmap-value 512 29\. 指定是否激活重置哈希,默認為開啟(后面在介紹Redis的哈希算法時具體介紹) activerehashing yes 30\. 指定包含其它的配置文件,可以在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自己的特定配置文件 include /path/to/local.confRedis 鍵(key)
Redis 鍵命令用于管理 redis 的鍵。
語法
Redis 鍵命令的基本語法如下:
redis 127.0.0.1:6379> COMMAND KEY_NAME實例
redis 127.0.0.1:6379> SET runoobkey redis OK redis 127.0.0.1:6379> DEL runoobkey (integer) 1在以上實例中 DEL 是一個命令, runoobkey 是一個鍵。 如果鍵被刪除成功,命令執(zhí)行后輸出 (integer) 1,否則將輸出 (integer) 0Redis keys 命令
下表給出了與 Redis 鍵相關(guān)的基本命令:
1 DEL key 該命令用于在 key 存在時刪除 key。 2 DUMP key 序列化給定 key ,并返回被序列化的值。 3 EXISTS key 檢查給定 key 是否存在。 4 EXPIRE key seconds 為給定 key 設(shè)置過期時間。 5 EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 類似,都用于為 key 設(shè)置過期時間。 不同在于 EXPIREAT 命令接受的時間參數(shù)是 UNIX 時間戳(unix timestamp)。 6 PEXPIRE key milliseconds 設(shè)置 key 的過期時間以毫秒計。 7 PEXPIREAT key milliseconds-timestamp 設(shè)置 key 過期時間的時間戳(unix timestamp) 以毫秒計 8 KEYS pattern 查找所有符合給定模式( pattern)的 key 。 9 MOVE key db 將當前數(shù)據(jù)庫的 key 移動到給定的數(shù)據(jù)庫 db 當中。 10 PERSIST key 移除 key 的過期時間,key 將持久保持。 11 PTTL key 以毫秒為單位返回 key 的剩余的過期時間。 12 TTL key 以秒為單位,返回給定 key 的剩余生存時間(TTL, time to live)。 13 RANDOMKEY 從當前數(shù)據(jù)庫中隨機返回一個 key 。 14 RENAME key newkey 修改 key 的名稱 15 RENAMENX key newkey 僅當 newkey 不存在時,將 key 改名為 newkey 。 16 TYPE key 返回 key 所儲存的值的類型Redis 數(shù)據(jù)類型
Redis支持五種數(shù)據(jù)類型: string(字符串), hash(哈希), list(列表), set(集合) zset(sorted set:有序集合)。String(字符串)
string是redis最基本的類型,你可以理解成與Memcached一模一樣的類型,一個key對應(yīng)一個value。 string類型是二進制安全的。意思是redis的string可以包含任何數(shù)據(jù)。比如jpg圖片或者序列化的對象 。 string類型是Redis最基本的數(shù)據(jù)類型,一個鍵最大能存儲512MB。實例
redis 127.0.0.1:6379> SET name "runoob" OK redis 127.0.0.1:6379> GET name "runoob"在以上實例中我們使用了 Redis 的 SET 和 GET 命令。鍵為 name,對應(yīng)的值為 runoob。 注意:一個鍵最大能存儲512MB。Redis 字符串命令
1 SET key value 設(shè)置指定 key 的值 2 GET key 獲取指定 key 的值。 3 GETRANGE key start end 返回 key 中字符串值的子字符 4 GETSET key value 將給定 key 的值設(shè)為 value ,并返回 key 的舊值(old value)。 5 GETBIT key offset 對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。 6 MGET key1 [key2..] 獲取所有(一個或多個)給定 key 的值。 7 SETBIT key offset value 對 key 所儲存的字符串值,設(shè)置或清除指定偏移量上的位(bit)。 8 SETEX key seconds value 將值 value 關(guān)聯(lián)到 key ,并將 key 的過期時間設(shè)為 seconds (以秒為單位)。 9 SETNX key value 只有在 key 不存在時設(shè)置 key 的值。 10 SETRANGE key offset value 用 value 參數(shù)覆寫給定 key 所儲存的字符串值,從偏移量 offset 開始。 11 STRLEN key 返回 key 所儲存的字符串值的長度。 12 MSET key value [key value ...] 同時設(shè)置一個或多個 key-value 對。 13 MSETNX key value [key value ...] 同時設(shè)置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。 14 PSETEX key milliseconds value 這個命令和 SETEX 命令相似,但它以毫秒為單位設(shè)置 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位。 15 INCR key 將 key 中儲存的數(shù)字值增一。 16 INCRBY key increment 將 key 所儲存的值加上給定的增量值(increment) 。 17 INCRBYFLOAT key increment 將 key 所儲存的值加上給定的浮點增量值(increment) 。 18 DECR key 將 key 中儲存的數(shù)字值減一。 19 DECRBY key decrement key 所儲存的值減去給定的減量值(decrement) 。 20 APPEND key value 如果 key 已經(jīng)存在并且是一個字符串, APPEND 命令將 value 追加到 key 原來的值的末尾。Hash(哈希)
Redis hash 是一個鍵值(key=>value)對集合。 Redis hash是一個string類型的field和value的映射表,hash特別適合用于存儲對象。實例
redis> HMSET myhash field1 "Hello" field2 "World" "OK" redis> HGET myhash field1 "Hello" redis> HGET myhash field2 "World"以上實例中 hash 數(shù)據(jù)類型存儲了包含用戶腳本信息的用戶對象。 實例中我們使用了 Redis HMSET, HGETALL 命令,user:1 為鍵值。 每個 hash 可以存儲 232 -1 鍵值對(40多億)。Redis hash 命令
1 HDEL key field1 [field2] 刪除一個或多個哈希表字段 2 HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。 3 HGET key field 獲取存儲在哈希表中指定字段的值。 4 HGETALL key 獲取在哈希表中指定 key 的所有字段和值 5 HINCRBY key field increment 為哈希表 key 中的指定字段的整數(shù)值加上增量 increment 。 6 HINCRBYFLOAT key field increment 為哈希表 key 中的指定字段的浮點數(shù)值加上增量 increment 。 7 HKEYS key 獲取所有哈希表中的字段 8 HLEN key 獲取哈希表中字段的數(shù)量 9 HMGET key field1 [field2] 獲取所有給定字段的值 10 HMSET key field1 value1 [field2 value2 ] 同時將多個 field-value (域-值)對設(shè)置到哈希表 key 中。 11 HSET key field value 將哈希表 key 中的字段 field 的值設(shè)為 value 。 12 HSETNX key field value 只有在字段 field 不存在時,設(shè)置哈希表字段的值。 13 HVALS key 獲取哈希表中所有值 14 HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的鍵值對。List(列表)
Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。實例
redis 127.0.0.1:6379> lpush runoob redis (integer) 1 redis 127.0.0.1:6379> lpush runoob mongodb (integer) 2 redis 127.0.0.1:6379> lpush runoob rabitmq (integer) 3 redis 127.0.0.1:6379> lrange runoob 0 10 1) "rabitmq" 2) "mongodb" 3) "redis" redis 127.0.0.1:6379>列表最多可存儲 232 - 1 元素 (4294967295, 每個列表可存儲40多億)。Redis 列表命令
1 BLPOP key1 [key2 ] timeout 移出并獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發(fā)現(xiàn)可彈出元素為止。 2 BRPOP key1 [key2 ] timeout 移出并獲取列表的最后一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發(fā)現(xiàn)可彈出元素為止。 3 BRPOPLPUSH source destination timeout 從列表中彈出一個值,將彈出的元素插入到另外一個列表中并返回它; 如果列表沒有元素會阻塞列表直到等待超時或發(fā)現(xiàn)可彈出元素為止。 4 LINDEX key index 通過索引獲取列表中的元素 5 LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素 6 LLEN key 獲取列表長度 7 LPOP key 移出并獲取列表的第一個元素 8 LPUSH key value1 [value2] 將一個或多個值插入到列表頭部 9 LPUSHX key value 將一個值插入到已存在的列表頭部 10 LRANGE key start stop 獲取列表指定范圍內(nèi)的元素 11 LREM key count value 移除列表元素 12 LSET key index value 通過索引設(shè)置列表元素的值 13 LTRIM key start stop 對一個列表進行修剪(trim),就是說,讓列表只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間之內(nèi)的元素都將被刪除。 14 RPOP key 移除并獲取列表最后一個元素 15 RPOPLPUSH source destination 移除列表的最后一個元素,并將該元素添加到另一個列表并返回 16 RPUSH key value1 [value2] 在列表中添加一個或多個值 17 RPUSHX key value 為已存在的列表添加值Set(集合)
Redis的Set是string類型的無序集合。 集合是通過哈希表實現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。 sadd 命令 添加一個string元素到,key對應(yīng)的set集合中,成功返回1,如果元素已經(jīng)在集合中返回0,key對應(yīng)的set不存在返回錯誤。 sadd key member實例
redis 127.0.0.1:6379> sadd runoob redis (integer) 1 redis 127.0.0.1:6379> sadd runoob mongodb (integer) 1 redis 127.0.0.1:6379> sadd runoob rabitmq (integer) 1 redis 127.0.0.1:6379> sadd runoob rabitmq (integer) 0 redis 127.0.0.1:6379> smembers runoob1) "rabitmq" 2) "mongodb" 3) "redis"注意:以上實例中 rabitmq 添加了兩次,但根據(jù)集合內(nèi)元素的唯一性,第二次插入的元素將被忽略。 集合中最大的成員數(shù)為 232 - 1(4294967295, 每個集合可存儲40多億個成員)。Redis 集合命令
1 SADD key member1 [member2] 向集合添加一個或多個成員 2 SCARD key 獲取集合的成員數(shù) 3 SDIFF key1 [key2] 返回給定所有集合的差集 4 SDIFFSTORE destination key1 [key2] 返回給定所有集合的差集并存儲在 destination 中 5 SINTER key1 [key2] 返回給定所有集合的交集 6 SINTERSTORE destination key1 [key2] 返回給定所有集合的交集并存儲在 destination 中 7 SISMEMBER key member 判斷 member 元素是否是集合 key 的成員 8 SMEMBERS key 返回集合中的所有成員 9 SMOVE source destination member 將 member 元素從 source 集合移動到 destination 集合 10 SPOP key 移除并返回集合中的一個隨機元素 11 SRANDMEMBER key [count] 返回集合中一個或多個隨機數(shù) 12 SREM key member1 [member2] 移除集合中一個或多個成員 13 SUNION key1 [key2] 返回所有給定集合的并集 14 SUNIONSTORE destination key1 [key2] 所有給定集合的并集存儲在 destination 集合中 15 SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素zset(sorted set:有序集合)
Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復(fù)的成員。 不同的是每個元素都會關(guān)聯(lián)一個double類型的分數(shù)。redis正是通過分數(shù)來為集合中的成員進行從小到大的排序。 zset的成員是唯一的,但分數(shù)(score)卻可以重復(fù)。 zadd 命令 添加元素到集合,元素在集合中存在則更新對應(yīng)score zadd key score member實例
redis 127.0.0.1:6379> zadd runoob 0 redis (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 mongodb (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq (integer) 0 redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 10001) "redis" 2) "mongodb" 3) "rabitmq"Redis 有序集合命令
1 ZADD key score1 member1 [score2 member2] 向有序集合添加一個或多個成員,或者更新已存在成員的分數(shù) 2 ZCARD key 獲取有序集合的成員數(shù) 3 ZCOUNT key min max 計算在有序集合中指定區(qū)間分數(shù)的成員數(shù) 4 ZINCRBY key increment member 有序集合中對指定成員的分數(shù)加上增量 increment 5 ZINTERSTORE destination numkeys key [key ...] 計算給定的一個或多個有序集的交集并將結(jié)果集存儲在新的有序集合 key 中 6 ZLEXCOUNT key min max 在有序集合中計算指定字典區(qū)間內(nèi)成員數(shù)量 7 ZRANGE key start stop [WITHSCORES] 通過索引區(qū)間返回有序集合成指定區(qū)間內(nèi)的成員 8 ZRANGEBYLEX key min max [LIMIT offset count] 通過字典區(qū)間返回有序集合的成員 9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通過分數(shù)返回有序集合指定區(qū)間內(nèi)的成員 10 ZRANK key member 返回有序集合中指定成員的索引 11 ZREM key member [member ...] 移除有序集合中的一個或多個成員 12 ZREMRANGEBYLEX key min max 移除有序集合中給定的字典區(qū)間的所有成員 13 ZREMRANGEBYRANK key start stop 移除有序集合中給定的排名區(qū)間的所有成員 14 ZREMRANGEBYSCORE key min max 移除有序集合中給定的分數(shù)區(qū)間的所有成員 15 ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定區(qū)間內(nèi)的成員,通過索引,分數(shù)從高到底 16 ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分數(shù)區(qū)間內(nèi)的成員,分數(shù)從高到低排序 17 ZREVRANK key member 返回有序集合中指定成員的排名,有序集成員按分數(shù)值遞減(從大到小)排序 18 ZSCORE key member 返回有序集中,成員的分數(shù)值 19 ZUNIONSTORE destination numkeys key [key ...] 計算給定的一個或多個有序集的并集,并存儲在新的 key 中 20 ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成員和元素分值)HyperLogLog
Redis 在 2.8.9 版本添加了 HyperLogLog 結(jié)構(gòu)。 Redis HyperLogLog 是用來做基數(shù)統(tǒng)計的算法,HyperLogLog 的優(yōu)點是,在輸入元素的數(shù)量或者體積非常非常大時,計算基數(shù)所需的空間總是固定 的、并且是很小的。 在 Redis 里面,每個 HyperLogLog 鍵只需要花費 12 KB 內(nèi)存,就可以計算接近 2^64 個不同元素的基 數(shù)。這和計算基數(shù)時,元素越多耗費內(nèi)存就越多的集合形成鮮明對比。 但是,因為 HyperLogLog 只會根據(jù)輸入元素來計算基數(shù),而不會儲存輸入元素本身,所以 HyperLogLog 不能像集合那樣,返回輸入的各個元素。什么是基數(shù)?
比如數(shù)據(jù)集 {1, 3, 5, 7, 5, 7, 8}, 那么這個數(shù)據(jù)集的基數(shù)集為 {1, 3, 5 ,7, 8}, 基數(shù)(不重復(fù)元素)為5。 基數(shù)估計就是在誤差可接受的范圍內(nèi),快速計算基數(shù)。實例
redis 127.0.0.1:6379> PFADD runoobkey "redis" 1) (integer) 1 redis 127.0.0.1:6379> PFADD runoobkey "mongodb" 1) (integer) 1 redis 127.0.0.1:6379> PFADD runoobkey "mysql" 1) (integer) 1 redis 127.0.0.1:6379> PFCOUNT runoobkey (integer) 3Redis HyperLogLog 命令
1 PFADD key element [element ...] 添加指定元素到 HyperLogLog 中。 2 PFCOUNT key [key ...] 返回給定 HyperLogLog 的基數(shù)估算值。 3 PFMERGE destkey sourcekey [sourcekey ...] 將多個 HyperLogLog 合并為一個 HyperLogLog發(fā)布訂閱
Redis 發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息,訂閱者(sub)接收消息。 Redis 客戶端可以訂閱任意數(shù)量的頻道。 下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關(guān)系: image 當有新消息通過 PUBLISH 命令發(fā)送給頻道 channel1 時, 這個消息就會被發(fā)送給訂閱它的三個客戶端: image實例
redis 127.0.0.1:6379> SUBSCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat" 3) (integer) 1現(xiàn)在,我們先重新開啟個 redis 客戶端,然后在同一個頻道 redisChat 發(fā)布兩次消息,訂閱者就能接收到消息。redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique" (integer) 1 redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by runoob.com" (integer) 1# 訂閱者的客戶端會顯示如下消息 1) "message" 2) "redisChat" 3) "Redis is a great caching technique" 1) "message" 2) "redisChat" 3) "Learn redis by runoob.com"Redis 發(fā)布訂閱命令
1 PSUBSCRIBE pattern [pattern ...] 訂閱一個或多個符合給定模式的頻道。 2 PUBSUB subcommand [argument [argument ...]] 查看訂閱與發(fā)布系統(tǒng)狀態(tài)。 3 PUBLISH channel message 將信息發(fā)送到指定的頻道。 4 PUNSUBSCRIBE [pattern [pattern ...]] 退訂所有給定模式的頻道。 5 SUBSCRIBE channel [channel ...] 訂閱給定的一個或多個頻道的信息。 6 UNSUBSCRIBE [channel [channel ...]] 指退訂給定的頻道。Redis 事務(wù)
Redis 事務(wù)可以一次執(zhí)行多個命令, 并且?guī)в幸韵聝蓚€重要的保證: 事務(wù)是一個單獨的隔離操作:事務(wù)中的所有命令都會序列化、按順序地執(zhí)行。事務(wù)在執(zhí)行的過程中,不會被其他客戶端發(fā)送來的命令請求所打斷。 事務(wù)是一個原子操作:事務(wù)中的命令要么全部被執(zhí)行,要么全部都不執(zhí)行。 一個事務(wù)從開始到執(zhí)行會經(jīng)歷以下三個階段: 開始事務(wù)。 命令入隊。 執(zhí)行事務(wù)。實例
`` txt 以下是一個事務(wù)的例子, 它先以 MULTI 開始一個事務(wù), 然后將多個命令入隊到事務(wù)中, 最后由 EXEC 命令觸發(fā)事務(wù), 一并執(zhí)行事務(wù)中的所有命令: redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days" QUEUED redis 127.0.0.1:6379> GET book-name QUEUED redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series" QUEUED redis 127.0.0.1:6379> SMEMBERS tag QUEUED redis 127.0.0.1:6379> EXEC
Redis 連接
Redis 連接命令主要是用于連接 redis 服務(wù)。實例
以下實例演示了客戶端如何通過密碼驗證連接到 redis 服務(wù),并檢測服務(wù)是否在運行: redis 127.0.0.1:6379> AUTH "password" OK redis 127.0.0.1:6379> PING PONGRedis 連接命令
1 AUTH password 驗證密碼是否正確 2 ECHO message 打印字符串 3 PING 查看服務(wù)是否運行 4 QUIT 關(guān)閉當前連接 5 SELECT index 切換到指定的數(shù)據(jù)庫Redis 服務(wù)器
Redis 服務(wù)器命令主要是用于管理 redis 服務(wù)。實例
以下實例演示了如何獲取 redis 服務(wù)器的統(tǒng)計信息: redis 127.0.0.1:6379> INFORedis 服務(wù)器命令
1 BGREWRITEAOF 異步執(zhí)行一個 AOF(AppendOnly File) 文件重寫操作 2 BGSAVE 在后臺異步保存當前數(shù)據(jù)庫的數(shù)據(jù)到磁盤 3 CLIENT KILL [ip:port] [ID client-id] 關(guān)閉客戶端連接 4 CLIENT LIST 獲取連接到服務(wù)器的客戶端連接列表 5 CLIENT GETNAME 獲取連接的名稱 6 CLIENT PAUSE timeout 在指定時間內(nèi)終止運行來自客戶端的命令 7 CLIENT SETNAME connection-name 設(shè)置當前連接的名稱 8 CLUSTER SLOTS 獲取集群節(jié)點的映射數(shù)組 9 COMMAND 獲取 Redis 命令詳情數(shù)組 10 COMMAND COUNT 獲取 Redis 命令總數(shù) 11 COMMAND GETKEYS 獲取給定命令的所有鍵 12 TIME 返回當前服務(wù)器時間 13 COMMAND INFO command-name [command-name ...] 獲取指定 Redis 命令描述的數(shù)組 14 CONFIG GET parameter 獲取指定配置參數(shù)的值 15 CONFIG REWRITE 對啟動 Redis 服務(wù)器時所指定的 redis.conf 配置文件進行改寫 16 CONFIG SET parameter value 修改 redis 配置參數(shù),無需重啟 17 CONFIG RESETSTAT 重置 INFO 命令中的某些統(tǒng)計數(shù)據(jù) 18 DBSIZE 返回當前數(shù)據(jù)庫的 key 的數(shù)量 19 DEBUG OBJECT key 獲取 key 的調(diào)試信息 20 DEBUG SEGFAULT 讓 Redis 服務(wù)崩潰 21 FLUSHALL 刪除所有數(shù)據(jù)庫的所有key 22 FLUSHDB 刪除當前數(shù)據(jù)庫的所有key 23 INFO [section] 獲取 Redis 服務(wù)器的各種信息和統(tǒng)計數(shù)值 24 LASTSAVE 返回最近一次 Redis 成功將數(shù)據(jù)保存到磁盤上的時間,以 UNIX 時間戳格式表示 25 MONITOR 實時打印出 Redis 服務(wù)器接收到的命令,調(diào)試用 26 ROLE 返回主從實例所屬的角色 27 SAVE 異步保存數(shù)據(jù)到硬盤 28 SHUTDOWN [NOSAVE] [SAVE] 異步保存數(shù)據(jù)到硬盤,并關(guān)閉服務(wù)器 29 SLAVEOF host port 將當前服務(wù)器轉(zhuǎn)變?yōu)橹付ǚ?wù)器的從屬服務(wù)器(slave server) 30 SLOWLOG subcommand [argument] 管理 redis 的慢日志 31 SYNC 用于復(fù)制功能(replication)的內(nèi)部命令Redis 數(shù)據(jù)備份與恢復(fù)
Redis SAVE 命令用于創(chuàng)建當前數(shù)據(jù)庫的備份。 語法 redis Save 命令基本語法如下: redis 127.0.0.1:6379> SAVE實例
redis 127.0.0.1:6379> SAVE OK 該命令將在 redis 安裝目錄中創(chuàng)建dump.rdb文件。恢復(fù)數(shù)據(jù)
如果需要恢復(fù)數(shù)據(jù),只需將備份文件 (dump.rdb) 移動到 redis 安裝目錄并啟動服務(wù)即可。獲取 redis 目錄可以使用 CONFIG 命令,如下所示: redis 127.0.0.1:6379> CONFIG GET dir 1) "dir" 2) "/usr/local/redis/bin" 以上命令 CONFIG GET dir 輸出的 redis 安裝目錄為 /usr/local/redis/bin。Bgsave
創(chuàng)建 redis 備份文件也可以使用命令 BGSAVE,該命令在后臺執(zhí)行。 實例 127.0.0.1:6379> BGSAVE Background saving startedRedis 客戶端連接
Redis 通過監(jiān)聽一個 TCP 端口或者 Unix socket 的方式來接收來自客戶端的連接,當一個連接建立后,Redis 內(nèi)部會進行以下一些操作:首先,客戶端 socket 會被設(shè)置為非阻塞模式,因為 Redis 在網(wǎng)絡(luò)事件處理上采用的是非阻塞多路復(fù)用模型。 然后為這個 socket 設(shè)置 TCP_NODELAY 屬性,禁用 Nagle 算法 然后創(chuàng)建一個可讀的文件事件用于監(jiān)聽這個客戶端 socket 的數(shù)據(jù)發(fā)送最大連接數(shù)
在 Redis2.4 中,最大連接數(shù)是被直接硬編碼在代碼里面的,而在2.6版本中這個值變成可配置的。 maxclients 的默認值是 10000,你也可以在 redis.conf 中對這個值進行修改。 config get maxclients 1) "maxclients" 2) "10000"實例
以下實例我們在服務(wù)啟動時設(shè)置最大連接數(shù)為 100000: redis-server --maxclients 100000客戶端命令
1 CLIENT LIST 返回連接到 redis 服務(wù)的客戶端列表 2 CLIENT SETNAME 設(shè)置當前連接的名稱 3 CLIENT GETNAME 獲取通過 CLIENT SETNAME 命令設(shè)置的服務(wù)名稱 4 CLIENT PAUSE 掛起客戶端連接,指定掛起的時間以毫秒計 5 CLIENT KILL 關(guān)閉客戶端連接三.Java 使用 Redis
下載jedis.jar
連接到 redis 服務(wù)
import redis.clients.jedis.Jedis;public class RedisJava {public static void main(String[] args) {//連接本地的 Redis 服務(wù)Jedis jedis = new Jedis("localhost");System.out.println("連接成功");//查看服務(wù)是否運行System.out.println("服務(wù)正在運行: "+jedis.ping());} } 編譯以上 Java 程序,確保驅(qū)動包的路徑是正確的。連接成功 服務(wù)正在運行: PONGRedis Java String(字符串) 實例
import redis.clients.jedis.Jedis;public class RedisStringJava {public static void main(String[] args) {//連接本地的 Redis 服務(wù)Jedis jedis = new Jedis("localhost");System.out.println("連接成功");//設(shè)置 redis 字符串數(shù)據(jù)jedis.set("runoobkey", "www.runoob.com");// 獲取存儲的數(shù)據(jù)并輸出System.out.println("redis 存儲的字符串為: "+ jedis.get("runoobkey"));} } 編譯以上程序。連接成功 redis 存儲的字符串為: www.runoob.comRedis Java List(列表) 實例
import java.util.List; import redis.clients.jedis.Jedis;public class RedisListJava {public static void main(String[] args) {//連接本地的 Redis 服務(wù)Jedis jedis = new Jedis("localhost");System.out.println("連接成功");//存儲數(shù)據(jù)到列表中jedis.lpush("site-list", "Runoob");jedis.lpush("site-list", "Google");jedis.lpush("site-list", "Taobao");// 獲取存儲的數(shù)據(jù)并輸出List<String> list = jedis.lrange("site-list", 0 ,2);for(int i=0; i<list.size(); i++) {System.out.println("列表項為: "+list.get(i));}} } 編譯以上程序。連接成功 列表項為: Taobao 列表項為: Google 列表項為: RunoobRedis Java Keys 實例
import java.util.Iterator; import java.util.Set; import redis.clients.jedis.Jedis;public class RedisKeyJava {public static void main(String[] args) {//連接本地的 Redis 服務(wù)Jedis jedis = new Jedis("localhost");System.out.println("連接成功");// 獲取數(shù)據(jù)并輸出Set<String> keys = jedis.keys("*"); Iterator<String> it=keys.iterator() ; while(it.hasNext()){ String key = it.next(); System.out.println(key); }} } 編譯以上程序。連接成功 runoobkey site-listMaven依賴
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.1.0</version> </dependency>java 代碼
package com.shier.common.test;import org.junit.Before; import org.junit.Test; import redis.clients.jedis.Jedis;import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map;public class RedisTest {private Jedis jedis;@Beforepublic void setup() {//連接redis服務(wù)器,192.168.0.100:6379jedis = new Jedis("172.16.57.150", 6379);//權(quán)限認證jedis.auth("shier@ixiye.com");jedis.select(1);}/*** redis存儲字符串*/@Testpublic void testString() {//-----添加數(shù)據(jù)----------jedis.set("name", "xinxin");//向key-->name中放入了value-->xinxinSystem.out.println(jedis.get("name"));//執(zhí)行結(jié)果:xinxinjedis.append("name", " is my lover"); //拼接System.out.println(jedis.get("name"));//jedis.del("name"); //刪除某個鍵System.out.println(jedis.get("name"));//設(shè)置多個鍵值對//jedis.mset("name", "liuling", "age", "23", "qq", "476777XXX");//jedis.incr("age"); //進行加1操作System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("qq"));}/*** redis操作Map*/@Testpublic void testMap() {//-----添加數(shù)據(jù)----------Map<String, String> map = new HashMap<String, String>();map.put("name", "xinxin");map.put("age", "22");map.put("qq", "123456");jedis.hmset("user", map);//取出user中的name,執(zhí)行結(jié)果:[minxr]-->注意結(jié)果是一個泛型的List//第一個參數(shù)是存入redis中map對象的key,后面跟的是放入map中的對象的key,后面的key可以跟多個,是可變參數(shù)List<String> rsmap = jedis.hmget("user", "name", "age", "qq");System.out.println(rsmap);//刪除map中的某個鍵值jedis.hdel("user", "age");System.out.println(jedis.hmget("user", "age")); //因為刪除了,所以返回的是nullSystem.out.println(jedis.hlen("user")); //返回key為user的鍵中存放的值的個數(shù)2System.out.println(jedis.exists("user"));//是否存在key為user的記錄 返回trueSystem.out.println(jedis.hkeys("user"));//返回map對象中的所有keySystem.out.println(jedis.hvals("user"));//返回map對象中的所有valueIterator<String> iter = jedis.hkeys("user").iterator();while (iter.hasNext()) {String key = iter.next();System.out.println(key + ":" + jedis.hmget("user", key));}}/*** jedis操作List*/@Testpublic void testList() {//開始前,先移除所有的內(nèi)容jedis.del("java framework");System.out.println(jedis.lrange("java framework", 0, -1));//先向key java framework中存放三條數(shù)據(jù)jedis.lpush("java framework", "spring");jedis.lpush("java framework", "struts");jedis.lpush("java framework", "hibernate");//再取出所有數(shù)據(jù)jedis.lrange是按范圍取出,// 第一個是key,第二個是起始位置,第三個是結(jié)束位置,jedis.llen獲取長度 -1表示取得所有System.out.println(jedis.lrange("java framework", 0, -1));jedis.del("java framework");jedis.rpush("java framework", "spring");jedis.rpush("java framework", "struts");jedis.rpush("java framework", "hibernate");System.out.println(jedis.lrange("java framework", 0, -1));}/*** jedis操作Set*/@Testpublic void testSet() {//添加jedis.sadd("user", "liuling");jedis.sadd("user", "xinxin");jedis.sadd("user", "ling");jedis.sadd("user", "zhangxinxin");jedis.sadd("user", "who");//移除nonamejedis.srem("user", "who");System.out.println(jedis.smembers("user"));//獲取所有加入的valueSystem.out.println(jedis.sismember("user", "who"));//判斷 who 是否是user集合的元素System.out.println(jedis.srandmember("user"));System.out.println(jedis.scard("user"));//返回集合的元素個數(shù)}@Testpublic void test() throws InterruptedException {//jedis 排序//注意,此處的rpush和lpush是List的操作。是一個雙向鏈表(但從表現(xiàn)來看的)jedis.del("a");//先清除數(shù)據(jù),再加入數(shù)據(jù)進行測試jedis.rpush("a", "1");jedis.lpush("a", "6");jedis.lpush("a", "3");jedis.lpush("a", "9");System.out.println(jedis.lrange("a", 0, -1));// [9, 3, 6, 1]System.out.println(jedis.sort("a")); //[1, 3, 6, 9] //輸入排序后結(jié)果System.out.println(jedis.lrange("a", 0, -1));}}RedisUtil
package com.shier.common.util;import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig;public final class RedisUtil {//Redis服務(wù)器IPprivate static String ADDR = "172.16.57.150";//Redis的端口號private static int PORT = 6379;//訪問密碼private static String AUTH = "shier@ixiye.com";//可用連接實例的最大數(shù)目,默認值為8;//如果賦值為-1,則表示不限制;如果pool已經(jīng)分配了maxActive個jedis實例,則此時pool的狀態(tài)為exhausted(耗盡)。private static int MAX_ACTIVE = 1024;//控制一個pool最多有多少個狀態(tài)為idle(空閑的)的jedis實例,默認值也是8。private static int MAX_IDLE = 200;//等待可用連接的最大時間,單位毫秒,默認值為-1,表示永不超時。如果超過等待時間,則直接拋出JedisConnectionException;private static int MAX_WAIT = 10000;private static int TIMEOUT = 10000;//在borrow一個jedis實例時,是否提前進行validate操作;如果為true,則得到的jedis實例均是可用的;private static boolean TEST_ON_BORROW = true;private static JedisPool jedisPool = null;/*** 初始化Redis連接池*/static {try {JedisPoolConfig config = new JedisPoolConfig();config.setMaxActive(MAX_ACTIVE);config.setMaxIdle(MAX_IDLE);config.setMaxWait(MAX_WAIT);config.setTestOnBorrow(TEST_ON_BORROW);jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);} catch (Exception e) {e.printStackTrace();}}/*** 獲取Jedis實例** @return*/public synchronized static Jedis getJedis() {try {if (jedisPool != null) {Jedis resource = jedisPool.getResource();return resource;} else {return null;}} catch (Exception e) {e.printStackTrace();return null;}}/*** 釋放jedis資源** @param jedis*/public static void returnResource(final Jedis jedis) {if (jedis != null) {jedisPool.returnResource(jedis);}} }-----------------------------------------------------------------package com.shier.common.test;import com.shier.common.util.RedisUtil; import org.junit.Test; import redis.clients.jedis.Jedis;public class RedisTest {@Testpublic void testRedisPool() {RedisUtil.getJedis().set("newname", "中文測試");System.out.println(RedisUtil.getJedis().get("newname"));} }四.Spring整合Redis
添加Redis Maven依賴
<span style="white-space:pre;"> </span><!-- redis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.6.2</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.7.1.RELEASE</version></dependency>config.properties
redis.host=192.168.0.254 redis.port=6379 redis.password=jedis21tbredis.maxIdle=300 redis.maxWait=1000 redis.testOnBorrow=true redis.timeout=3000spring配置文件(applicationContext.xml)
<!--引入配置屬性文件 --><context:property-placeholder location="classpath:config.properties" /><!-- redis --><!-- jedis 配置 --><bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" ><property name="maxIdle" value="${redis.maxIdle}" /><property name="maxWaitMillis" value="${redis.maxWait}" /><property name="testOnBorrow" value="${redis.testOnBorrow}" /></bean ><!-- redis服務(wù)器中心 --><bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" ><property name="poolConfig" ref="poolConfig" /><property name="port" value="${redis.port}" /><property name="hostName" value="${redis.host}" /><property name="password" value="${redis.password}" /><property name="timeout" value="${redis.timeout}" ></property></bean ><bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" ><property name="connectionFactory" ref="connectionFactory" /><property name="keySerializer" ><bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /></property><!-- <property name="valueSerializer" ><bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /></property> --></bean ><bean id="redisUtil" class="com.kttx.common.RedisUtil" ><property name="redisTemplate" ref="redisTemplate" /></bean >java代碼
package com.kttx.common;import java.io.Serializable; import java.util.Set; import java.util.concurrent.TimeUnit;import org.apache.log4j.Logger; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations;/*** redis* @author txs**/ public class RedisUtil {private static Logger logger = Logger.getLogger(RedisUtil.class);private static RedisTemplate<Serializable, Object> redisTemplate;/*** 寫入或更新緩存* @param key* @param value* @return*/public static boolean set(final String key, Object value){boolean result = false;try {ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();operations.set(key, value);result = true;} catch (Exception e) {logger.error("write redis is faill");e.printStackTrace();}return result;}/** * 寫入緩存 * 設(shè)置失效時間* @param key * @param value * @return */ public static boolean set(final String key, Object value, Long expireTime) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate .opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /*** 讀取緩存* @param key* @return*/public static Object get(final String key){Object result = null;ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();result = operations.get(key);return result;}/*** 刪除對應(yīng)的value* @param key*/public static void remove(final String key){if (exists(key)) {redisTemplate.delete(key);}}/*** 批量刪除對應(yīng)的value* * @param keys*/public static void remove(final String... keys) {for (String key : keys) {remove(key);}}/*** 批量刪除key* * @param pattern 正則表達式*/public static void removePattern(final String pattern) {Set<Serializable> keys = redisTemplate.keys(pattern);if (keys.size() > 0)redisTemplate.delete(keys);}/*** 判斷緩存中是否有對應(yīng)的value* * @param key* @return*/public static boolean exists(final String key) {return redisTemplate.hasKey(key);}public void setRedisTemplate(RedisTemplate<Serializable, Object> redisTemplate) {this.redisTemplate = redisTemplate;} }五.Spring boot整合Redis
添加maveny依賴
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.6.2</version> </dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.7.1.RELEASE</version> </dependency>配置屬性:
# database name spring.redis.database=0 # server host spring.redis.host=127.0.0.1 # server password spring.redis.password=123456 #connection port spring.redis.port=6379 # pool settings ... spring.redis.pool.max-idle=8 spring.redis.pool.min-idle=0 spring.redis.pool.max-active=8 spring.redis.pool.max-wait=-1redis配置
package com.ming.config;import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map;import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper;@Configuration @EnableCaching // 啟用緩存,這個注解很重要; public class RedisCacheConfig extends CachingConfigurerSupport {/*** 生成key的策略** @return*/@Beanpublic KeyGenerator keyGenerator() {return new KeyGenerator() {@Overridepublic Object generate(Object target, Method method, Object... params) {StringBuilder sb = new StringBuilder();sb.append(target.getClass().getName());sb.append(method.getName());for (Object obj : params) {sb.append(obj.toString());}return sb.toString();}};}/*** 管理緩存** @param redisTemplate* @return*/@SuppressWarnings("rawtypes")@Beanpublic CacheManager cacheManager(RedisTemplate redisTemplate) {RedisCacheManager rcm = new RedisCacheManager(redisTemplate);//設(shè)置緩存過期時間// rcm.setDefaultExpiration(60);//秒//設(shè)置value的過期時間Map<String,Long> map=new HashMap<String, Long>();map.put("test",60L);rcm.setExpires(map);return rcm;}/*** RedisTemplate配置* @param factory* @return*/@Beanpublic RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {StringRedisTemplate template = new StringRedisTemplate(factory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);template.setValueSerializer(jackson2JsonRedisSerializer);//如果key是String 需要配置一下StringSerializer,不然key會亂碼 /XX/XXtemplate.afterPropertiesSet();return template;}} package com.ming.config;import java.io.Serializable; import java.util.Set; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component;/*** redicache 工具類* */ @SuppressWarnings("unchecked") @Component public class RedisUtils {@SuppressWarnings("rawtypes")@Autowiredprivate RedisTemplate redisTemplate;/*** 批量刪除對應(yīng)的value* * @param keys*/public void remove(final String... keys) {for (String key : keys) {remove(key);}}/*** 批量刪除key* * @param pattern*/public void removePattern(final String pattern) {Set<Serializable> keys = redisTemplate.keys(pattern);if (keys.size() > 0)redisTemplate.delete(keys);}/*** 刪除對應(yīng)的value* * @param key*/public void remove(final String key) {if (exists(key)) {redisTemplate.delete(key);}}/*** 判斷緩存中是否有對應(yīng)的value* * @param key* @return*/public boolean exists(final String key) {return redisTemplate.hasKey(key);}/*** 讀取緩存* * @param key* @return*/public Object get(final String key) {Object result = null;ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();result = operations.get(key);return result;}/*** 寫入緩存* * @param key* @param value* @return*/public boolean set(final String key, Object value) {boolean result = false;try {ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();operations.set(key, value);result = true;} catch (Exception e) {e.printStackTrace();}return result;}/*** 寫入緩存* * @param key* @param value* @return*/public boolean set(final String key, Object value, Long expireTime) {boolean result = false;try {ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();operations.set(key, value);redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);result = true;} catch (Exception e) {e.printStackTrace();}return result;} }測試
package com.ming.web.controller;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import com.ming.config.RedisUtils;@RestController @RequestMapping("/caches") public class CacheController {@Autowiredprivate RedisUtils redisUtils;@RequestMapping("/test")public String test(){redisUtils.set("123", "hello world");System.out.println("進入了方法");String string= redisUtils.get("123").toString();return string;}}總結(jié)
以上是生活随笔為你收集整理的redis从入门到实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php编译安装与配置
- 下一篇: 在spring中使用自定义注解注册监听器