簡述
jedis是一款java操作redis數據庫的工具,有點類似於jdbc
使用准備
我們首先需要導入jedis的jar包,有兩個:
對5種數據的操作
Jedis類用於java程序和redis數據庫進行交互,一個最簡單的程序就是用java往redis里放數據,注意Jedis類的構造方法如果使用的是空參構造則默認值為自己的ip和6379端口,若要連接別人的數據庫則要用別人的ip和端口
//1.獲取連接 Jedis jedis = new Jedis("localhost",6379); //2.調用對應的方法操作 jedis.set("username","zhangsan");
String username = jedis.get("username");
//3.關閉連接
jedis.close();
可以使用Jedis操作redis的各種數據結構,需要知道的是jedis的方法和我們用命令操作redis是相似的
string類型
//1.獲取連接 Jedis jedis = new Jedis("localhost",6379); //2.調用對應的方法操作 jedis.set("username","zhangsan"); String username = jedis.get("username"); //可存儲指定過期時間的數據 jedis.setex("activeCode",20,"valueString"); System.out.println(username); //3.關閉連接 jedis.close();
Hash類型
//1.獲取連接 Jedis jedis = new Jedis("localhost",6379); //2.調用對應的方法操作 //存儲hash jedis.hset("user","name","zhangsan"); jedis.hset("user","age","23"); jedis.hset("user","gender","male"); //獲取單個hash數據 String name = jedis.hget("user", "name"); System.out.println(name); //獲取hash的所有map中的數據 Map<String,String> user = jedis.hgetAll("user"); for (String key : user.keySet()) { String value = user.get(key); System.out.println(key+":"+value); } //3.關閉連接 jedis.close();
列表類型
//1.獲取連接 Jedis jedis = new Jedis("localhost",6379); //2.調用對應的方法操作 //一次可以存多個值 jedis.lpush("mylist","a","b","c");//從左邊存 jedis.rpush("mylist","a","b","c");//從右邊存 //獲取數據 List<String> mylist = jedis.lrange("mylist", 0, -1); System.out.println(mylist); String element1 = jedis.lpop("mylist"); System.out.println(element1); //3.關閉連接 jedis.close();
set類型
//1.獲取連接 Jedis jedis = new Jedis("localhost",6379); //2.調用對應的方法操作 jedis.sadd("myset","java","php","cpp"); Set<String> myset = jedis.smembers("myset"); System.out.println(myset); //3.關閉連接 jedis.close();
有序set類型
//1.獲取連接 Jedis jedis = new Jedis("localhost",6379); //2.調用對應的方法操作 jedis.zadd("mysortedset",3,"亞索"); jedis.zadd("mysortedset",5,"蓋倫"); jedis.zadd("mysortedset",4,"猴子"); Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1); System.out.println(mysortedset); //3.關閉連接 jedis.close();
jedis連接池
jedis的連接池叫JedisPool,在創建連接池后我們可以從連接池中獲取連接,客戶端連接Redis使用的是TCP協議,直連的方式每次需要建立TCP連接,而連接池的方式是可以預先初始化好Jedis連接,所以每次只需要從Jedis連接池借用即可,而借用和歸還操作是在本地進行的,只有少量的並發同步開銷,遠遠小於新建TCP連接的開銷。
用連接池的一次普通的流程:
//創建配置對象 JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(50);//最大的連接數50 config.setMaxIdle(10);//最大的空閑連接數 //創建jedis連接池對象 JedisPool jedisPool = new JedisPool(config,"localhost",6379); //獲取連接 Jedis jedis = jedisPool.getResource(); //使用連接 jedis.set("username","hehe"); //關閉、歸還連接到連接池中 jedis.close();
將來實際應用的難點在於參數的配置:
#最大活動對象數
redis.pool.maxTotal=1000
#最大能夠保持idel狀態的對象數
redis.pool.maxIdle=100
#最小能夠保持idel狀態的對象數
redis.pool.minIdle=50
#當池內沒有返回對象時,最大等待時間
redis.pool.maxWaitMillis=10000
#當調用borrow Object方法時,是否進行有效性檢查
redis.pool.testOnBorrow=true
#當調用return Object方法時,是否進行有效性檢查
redis.pool.testOnReturn=true
#“空閑鏈接”檢測線程,檢測的周期,毫秒數。如果為負值,表示不運行“檢測線程”。默認為-1.
redis.pool.timeBetweenEvictionRunsMillis=30000
#向調用者輸出“鏈接”對象時,是否檢測它的空閑超時;
redis.pool.testWhileIdle=true
# 對於“空閑鏈接”檢測線程而言,每次檢測的鏈接資源的個數。默認為3.
redis.pool.numTestsPerEvictionRun=50
#redis服務器的IP
redis.ip=xxxxxx
#redis服務器的Port
redis1.port=6379
連接池工具類
如果把配置放在代碼里的話耦合度會比較高,所以一般我們把配置放在配置文件中,這樣要使用的時候加載配置即可。加載配置我們在工具類的靜態代碼塊中執行:
package util; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * Jedis連接池的工具類 * 加載配置文件,配置連接池的參數 * 提供獲取連接的方法 */ public class JedisPoolUtils { private static JedisPool jedisPool; static{ //獲取輸入流 InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties"); //創建properties對象 Properties properties = new Properties(); try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } //獲取數據、設置到JedisPoolConfig中 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal"))); jedisPoolConfig.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle"))); String host = properties.getProperty("host"); Integer port = Integer.parseInt(properties.getProperty("port")); System.out.println(host+","+port); jedisPool = new JedisPool(jedisPoolConfig,host,port); } /** * 獲取連接的方法 */ public static Jedis getJedis(){ return jedisPool.getResource(); } }