Redis官網所給的Redis安裝包只是基于linux系統的去操作的,所以想在windows系統中使用Redis服務,需要去下面的網址去下載對應的版本: https://github.com/MSOpenTech/redis/releases/tag/win-3.2.100 下載最新版本即可,如Redis-x64-3.2.100.zip。
下載完成后解壓,查看文件夾中是否有以下三個文件:
打開cmd窗口,進入到Redis所在文件夾。 執行redis-server.exe redis.windows.conf
命令,如出現Redis的LOGO,代表開啟Redis服務成功。
安裝成功后,此窗口不要關閉 ,再新開一個cmd窗口,輸入redis-cli.exe
命令,即可進行Redis命令的操作。 測試是否連接成功:輸入PING
,如果顯示PONG,即成功。
再來個Redis的HelloWorld: 輸入命令:set age 22
, 顯示OK后,再輸入命令:get age
即可得到age 的值:“22”。 是不是很簡單呢?下面將介紹Redis的基礎知識。
Redis是完全開源免費的,用C語言編寫的,遵守BSD協議, 是一個高性能的(key/value)分布式內存數據庫,基于內存運行 并支持持久化的NoSQL數據庫,是當前最熱門的NoSql數據庫之一,也被人們稱為數據結構服務器。
Redis主要有五種數據類型,下面將一 一進行介紹以及每種數據類型的常用命令。
在介紹數據類型之前先介紹下Redis的鍵key的幾個常用命令。
以上是常用的幾個key的命令,在以下的范例中都會用到這些命令。
1. String字符串
String是Redis最基本的類型 . 特點:是一個key對應一個value。
String類型時二進制安全的,可以包含任何數據,比如jpg圖片或者系列化的對象。一個Redis字符串value最多可以是512M。
String的常用命令如下圖:
2. List列表
特點:單值多value??衫斫鉃橐粋€集合中存儲多個數。
List是一個字符串鏈表,鏈表左右端都可以插入添加; 如果鍵不存在,創建新的鏈表; 如果鍵已存在,新增內容; 如果值全移除,對應的鍵也就消失了。 鏈表的操作無論是頭和尾效率都極高,但假如是對中間元素進行操作,效率就很慘淡了。
List的常用命令如下圖:
3. Set集合 特點:單值多value。如java中Set集合類似。
Redis的Set是string類型的無序集合。它是通過HashTable實現實現的
Set的常用命令如下圖:
4. Zset(Sorted set)-有序集合 特點:Zset是在set基礎上,加一個score值。
Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復的成員。 不同的是每個元素都會關聯一個double類型的分數。 redis正是通過分數來為集合中的成員進行從小到大的排序。zset的成員是唯一的,但分數(score)卻可以重復
比如說之前set是k1 v1 v2 v3, 現在zset是k1 score1 v1 score2 v2 score3 v3 在游戲中經常用到這種概念,比如在打怪的時候,每個人的排名是依據每個玩家所得分數進行排名的。這個分數就是score。
Zset的常用命令如下圖:
5. Hash哈希 特點:鍵值KV模式不變,不同的是V是一個鍵值對。
Redis hash 是一個鍵值對集合。 Redis hash是一個string類型的field和value的映射表,hash特別適合用于存儲對象。
Hash的常用命令如下:
Redis支持的客戶端操作語言非常豐富,達到40多種。就Java來說,最常用的還是客戶端Jedis。Jedis使用簡單,基本和Redis命令行語法相似。
本節主要是介紹Java中如何操作Redis。因為在Java中真正操作Redis并不是很多,所以本節只做一些了解性的介紹。
操作之前的準備: 1. Jedis需要添加兩個JAR包:
Commons-pool-1.6.jar Jedis-2.1.0.jar
如果是使用了MAVEN,就需要在pom.xml中加上依賴:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId></dependency>若在SPRing中配置,還需加上依賴:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId></dependency>2 . 本次操作環節既然是Windows, 需要在cmd窗口在中開啟Redis服務,才可進行下面的測試操作。
測試 1. 連接測試
import redis.clients.jedis.Jedis;/** * 連接測試 * @author wanggenshen_sx * */public class TestRedisConnection { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); System.out.println(jedis.ping()); }}輸出PONG,即為連接成功。
2. Redis五大數據類型測試 String
import redis.clients.jedis.Jedis;/** * 測試Redis五大數據類型---String * @author wanggenshen_sx * */public class TestRedisAPIString { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.flushDB(); //set k1 AA k2 BB k3 CC jedis.set("k1", "AA"); jedis.set("k2", "BB"); jedis.set("k3", "CC"); jedis.set("k4", "DD"); jedis.set("k5", "EE"); //查:get k2 System.out.println(jedis.get("k2")); //查全部:keys * System.out.println(jedis.keys("*")); //刪:del k2 jedis.del("k1"); System.out.println(jedis.keys("*")); }}輸出: BB [k3, k4, k5, k1, k2] [k3, k4, k5, k2]
List
import redis.clients.jedis.Jedis;/** * 測試Redis五大數據類型---List * @author wanggenshen_sx * */public class TestRedisAPIList { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); //清空數據庫:flush db jedis.flushDB(); //增:lpush list1 v1 // rpush list1 v3 jedis.lpush("list1", "v1"); jedis.lpush("list1", "v2"); jedis.rpush("list1", "v3"); //查:lrange list1 // llen list1 :集合list1的大小 System.out.println(jedis.lrange("list1", 0, jedis.llen("list1"))); //刪除元素:lrem list1 1 v2 // 從left往right刪除2個值等于v1的元素,返回的值為實際刪除的數量 jedis.lrem("list1", 1, "v2"); System.out.println(jedis.lrange("list1", 0, jedis.llen("list1"))); }}輸出: [v2, v1, v3] [v1, v3]
HashMap
import java.util.HashMap;import redis.clients.jedis.Jedis;/** * 測試Redis五大數據類型---HashMap * K不變,V是鍵值對 * @author wanggenshen_sx * */public class TestRedisAPIHashMap { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); //清空數據庫:flush db jedis.flushDB(); //增:hset hash1 k1 v1 k2 v3 jedis.hset("hash1", "k1", "v1"); jedis.hset("hash1", "k2", "v2"); //批量添加:hmset hash1 k3 v3 k4 v4 k5 v5 HashMap<String, String> map = new HashMap<String, String>(); map.put("k3", "v3"); map.put("k4", "v4"); map.put("k5", "v5"); jedis.hmset("hash1", map); //查:hget hash1 k2 System.out.println(jedis.hget("hash1", "k2")); //批量查詢:hmget hash1 k1 k2 k3 System.out.println(jedis.hmget("hash1", "k1", "k2", "k3")); //刪除元素:hdel hash1 k4 jedis.hdel("hash1", "k4"); //獲取全部 System.out.println(jedis.hgetAll("hash1")); }}輸出: v2 [v1, v2, v3] {k1=v1, k2=v2, k3=v3, k5=v5}
Set
import redis.clients.jedis.Jedis;/** * 測試Redis五大數據類型---Set * @author wanggenshen_sx * */public class TestRedisAPISet { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.flushDB(); //增:sadd set1 v1 v2 v3 jedis.sadd("set1", "v1"); jedis.sadd("set1", "v2"); jedis.sadd("set1", "v3"); jedis.sadd("set1", "v4"); jedis.sadd("set1", "v5"); //查:smemebers set1 System.out.println(jedis.smembers("set1")); //刪除元素:srem set1 v2 jedis.srem("set1", "v3"); System.out.println(jedis.smembers("set1")); }}輸出: [v1, v2, v3, v4, v5] [v1, v2, v4, v5]
ZSet
import java.util.HashMap;import java.util.Map;import redis.clients.jedis.Jedis;/** * 測試Redis五大數據類型---ZSet * @author wanggenshen_sx * */public class TestRedisAPIZSet { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.flushDB(); //增:zadd zset1 60 v1 70 v2 80 v3 90 v4 100 v5 jedis.zadd("zset1", 60, "v1"); jedis.zadd("zset1", 70, "v2"); Map<Double, String> map = new HashMap<>(); map.put(80.00, "v3"); map.put(90.00, "v4"); map.put(100.00, "v5"); jedis.zadd("zset1", map); //查:zrange zset1 0 -1 System.out.println(jedis.zrange("zset1", 0, -1)); //查:zrange zset1 0 -1 with scores System.out.println(jedis.zrangeWithScores("zset1", 0, -1)); //刪除元素:zrem zset1 v2 jedis.zrem("zset1", "v2"); System.out.println(jedis.zrangeWithScores("zset1", 0, -1)); }}輸出: [v1, v2, v3, v4, v5] [[[118, 49],60.0], [[118, 50],70.0], [[118, 51],80.0], [[118, 52],90.0], [[118, 53],100.0]] [[[118, 49],60.0], [[118, 51],80.0], [[118, 52],90.0], [[118, 53],100.0]]
3.JedisPool JedisPool的概念類似于線程池,即獲取Jedis實例需要從JedisPool中獲取,用完Jedis實例也需要還給JedisPool。 并且需要在finally中去關閉。
如下,先寫個操作JedisPool的工具類:
import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;/** * 使用單例模式獲取JedisPool實例 * */public class JedisPoolUtil { private static volatile JedisPool jedisPool = null; public static JedisPool getJedisPoolInstance(){ if(null == jedisPool){ synchronized(JedisPoolUtil.class){ JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); //控制一個pool可分配多少個jedis實例 jedisPoolConfig.setMaxActive(1000); //控制一個pool最多有多少個狀態為idle(空閑)的jedis實例 jedisPoolConfig.setMaxIdle(32); //表示當borrow一個jedis實例時,最大的等待時間,如果超過等待時間,則直接拋JedisConnectionException; jedisPoolConfig.setMaxWait(100*1000); //獲得一個jedis實例的時候是否檢查連接可用性(ping()) jedisPoolConfig.setTestOnBorrow(true); jedisPool = new JedisPool("127.0.0.1", 6379); } } return jedisPool; } public static void release(JedisPool jedisPool,Jedis jedis){ if(jedis != null){ jedisPool.returnResourceObject(jedis); } } public JedisPoolUtil(){}}測試:
import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;public class TestRedisPool { public static void main(String[] args) { JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance(); Jedis jedis = null; try{ jedis = jedisPool.getResource(); jedis.set("aa", "bb"); System.out.println(jedis.get("aa")); }catch(Exception e) { e.printStackTrace(); }finally{ JedisPoolUtil.release(jedisPool, jedis); } }}JedisPool的配置參數大部分是由JedisPoolConfig的對應項來賦值的。
Jedis的配置介紹: - maxActive:控制一個pool可分配多少個jedis實例,通過pool.getResource()來獲??;如果賦值為-1,則表示不限制;如果pool已經分配了maxActive個jedis實例,則此時pool的狀態為exhausted。 - maxIdle:控制一個pool最多有多少個狀態為idle(空閑)的jedis實例; whenExhaustedAction:表示當pool中的jedis實例都被allocated完時,pool要采取的操作;默認有三種。 WHEN_EXHAUSTED_FAIL –> 表示無jedis實例時,直接拋出NoSuchElementException; WHEN_EXHAUSTED_BLOCK –> 則表示阻塞住,或者達到maxWait時拋出JedisConnectionException; WHEN_EXHAUSTED_GROW –> 則表示新建一個jedis實例,也就說設置的maxActive無用; - maxWait:表示當borrow一個jedis實例時,最大的等待時間,如果超過等待時間,則直接拋JedisConnectionException; - testOnBorrow:獲得一個jedis實例的時候是否檢查連接可用性(ping());如果為true,則得到的jedis實例均是可用的; - testOnReturn:return 一個jedis實例給pool時,是否檢查連接可用性(ping()); - testWhileIdle:如果為true,表示有一個idle object evitor線程對idle object進行掃描,如果validate失敗,此object會被從pool中drop掉;這一項只有在 timeBetweenEvictionRunsMillis大于0時才有意義; - timeBetweenEvictionRunsMillis:表示idle object evitor兩次掃描之間要sleep的毫秒數; - numTestsPerEvictionRun:表示idle object evitor每次掃描的最多的對象數; - minEvictableIdleTimeMillis:表示一個對象至少停留在idle狀態的最短時間,然后才能被idle object evitor掃描并驅逐;這一項只有在timeBetweenEvictionRunsMillis大于0時才有意義 - softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基礎上,加入了至少minIdle個對象已經在pool里面了。如果為-1,evicted不會根據idle time驅逐任何對象。如果minEvictableIdleTimeMillis>0,則此項設置無意義,且只有在timeBetweenEvictionRunsMillis大于0時才有意義; - lifo:borrowObject返回對象時,是采用DEFAULT_LIFO(last in first out,即類似cache的最頻繁使用隊列),如果為False,則表示FIFO隊列;
================================================ 其中JedisPoolConfig對一些參數的默認設置如下:
testWhileIdle=true minEvictableIdleTimeMills=60000 timeBetweenEvictionRunsMillis=30000 numTestsPerEvictionRun=-1
(此處CSDN格式有問題,強迫癥實在受不鳥)
新聞熱點
疑難解答