redis -java客戶端jedis
接上一篇
1 key可以有過期的設定
2 Lists 列表
插入元素很快,
按索引查詢,慢
//列表是自動建立和刪除的
//從左側新增給List1 一個值 1
lpush list1 1
//從右側新增2
rpush list1 2
//返回list1的值,從索引0 到最後
lrange list1 0 -1
//可變引數
lpush list1 1 3 3 2
//從list中右側那一個查詢並刪除
rpop list1
//子列表,其他的被刪除
//保留list中索引0 ~ 2的,並返回,其他的刪除
ltrim list1 0 2
//實現佇列. 左側新增(生產),右側彈出(消費)
//如果右側彈出為nil,那麼會等待一段時間再彈
lpush list1 666
rpop list1
//實現阻塞佇列
//block right pop 從list1中右側彈出元素,如果為null,那麼等待(阻塞)5秒
//直到有元素返回 0為一直阻塞(問,中間多久輪詢一次?)
brpop list1 5
3 hash(map)
//建立表hash_user1 ,裡面的key-value對,分別為name:wanganyu 等等
hmset hash_user1 name wanganyu age 23 address 回龍觀東大街
//從hash中獲得key為name的value
hget hash_user1 name
//獲得全部value
hgetall hash_user1
//返回hash中key為name ,age的值得陣列
hmget hash_user1 name age
4 set(集合)
無序
//新增
sadd set1 1 3 6
//檢視元素(返回的是無序的)
smembers set1
//檢視是否存在某元素
sismember set1 3
返回1 ,否則返回0
//刪除元素並返回(隨機)
spop set1
//交集 操作
sinter set1 set2 set3
//並集操作
sadd set1 set2
5 有序集合
新增時慢(因為要排序),取時快(因為有序了)
//新增 下面的2,56是分數, 是排序的依據
zadd zset1 2 “tom”
zadd zset1 56 “john”
//檢視元素(從第0個到倒數第一個)
zrange zset1 0 -1
//反序檢視
zrevrange zset1 0 -1
//根據分數返回 (小於某值的所有)
zrangebyscore zset1 -inf 4
//根據分數刪除(分數在2到8之間)
zremrangebyscore zset1 2 8
//獲得元素的位置
zrank zset1 “tom”
6 點陣圖(bitmaps)
基體是一個字串,每一個是一個‘位’,值為0或者1 。
//設定某位的值(字串bm1,第10位設定為1)
setbit bm1 10 1
//取某位的值(返回1,或者0)
getbit bm1 10
//計算所有值為1的位的數量
bitcount bm1
//找到第一個為1的位(索引)
bitpos bm1
7 redis可以像zookeeper一樣,實現釋出訂閱的功能
8 事務
格式如下:
//標記一個事務塊的開始
multi
命令1
命令2
//執行上述命令
exec
8-2:
其他: discard 取消事務
9 指令碼
除了執行一條命令,還可以執行指令碼
使用eval
eval “return xxxxx”
10 管理伺服器
10-1 檢視資訊
info
11 管道技術
其實就是 一次性提交多個請求到server,然後一次性返回所有響應,
以此提升效能
採用橋接(跟主機平行的關係)的網路連線方式,
我本機ip192.168.1.102,虛擬機器ip 106
使用如下程式碼測試連線時,出現一些問題,最終解決,列印了PONG(通)
Jedis jedis = new Jedis(“192.168.1.106”,6379);
System.out.println(jedis.ping());
問題1:連線不上redis.雖然ping的tong106.
解決: 關閉虛擬機器的防火牆,重啟虛擬機器。
方法為,在終端執行chkconfig iptables off
問題2:提示 DENIED Redis is running in protected mode because protected mode is enabled 等錯誤
解決:vim編輯redis.config檔案,把保護模式變為no.重啟
如果提示readonly不能儲存檔案,那麼使用sudo vim
測試是否能連上虛擬機器配置的redis服務
/***
* 測試是否能連上虛擬機器配置的redis服務
* @author wangany
*
*/
public class JedisConnectTest {
/**
* @param args
*/
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.1.106",6379);
System.out.println(jedis.ping());
}
public void testStringKey(){
}
}
建立連線池物件
/***
* 真實環境,獲得jedis連線 要使用連線池
*
*
* @author wangany
*
*/
public class JedisPoolUtil {
private static JedisPool jedisPool;//連線池物件
/***
* 從連線池中 獲取一個jedis物件
* @return
*/
public static Jedis getJedis(){
if(jedisPool==null){
iniPool();
}
return jedisPool.getResource();
}
/***
* 初始化連線池物件
*/
public static void iniPool(){
if(jedisPool==null){
createPool();
}
}
/***
* 建立連線池物件
*
* 真實環境,配置的資訊要抽離出來
*/
public static void createPool(){
// 建立連線池配置引數
JedisPoolConfig config = new JedisPoolConfig();
// 設定最大連線數
config.setMaxIdle(100);
// 設定最大阻塞時間,記住是毫秒數milliseconds
config.setMaxWaitMillis(1000);
// 設定空間連線
config.setMaxIdle(10);
// 建立連線池
jedisPool = new JedisPool(config, "192.168.1.106", 6379);
}
/***
* 回收一個jedis物件到連線池
* @param jedis
*/
public static void gc(Jedis jedis){
jedisPool.returnResource(jedis);
}
常用的操作
/***
* 常用的操作
* key
* list
* set
* hset等
* @author wangany
*
*/
public class JedisCommonOpt {
private static Jedis jedis;
public JedisCommonOpt() {
jedis = getJedis();
}
public static Jedis getJedis(){
if(jedis==null){
jedis = JedisPoolUtil.getJedis();
}
return jedis;
}
/***
* 測試 key
*/
public void testKey() {
jedis.set("key1", "value1");
String value1 = jedis.get("key1");
System.out.println(value1);
}
/***
* 測試 list
*/
public void testList() {
String[] valueOfList1 = {"value1OfList1","value2OfList1","value3OfList1"};
jedis.lpush("list1", valueOfList1);
// 獲取儲存的資料並輸出
List list = jedis.lrange("list1", 0 ,-1);
for(int i=0; i<list.size(); i++) {
System.out.println("Stored string in redis:list1: "+list.get(i));
}
}
public static void main(String[] args) {
JedisCommonOpt opt = new JedisCommonOpt();
//opt.testKey();
opt.testList();
}
}