java使用redis
應用Redis實現數據的讀寫,同時利用隊列處理器定時將數據寫入mysql。
同時要注意避免沖突,在redis啟動時去mysql讀取所有表鍵值存入redis中,往redis寫數據時,對redis主鍵自增並進行讀取,若mysql更新失敗,則需要及時清除緩存及同步redis主鍵。
這樣處理,主要是實時讀寫redis,而mysql數據則通過隊列非同步處理,緩解mysql壓力,不過這種方法應用場景主要基於高並發,而且redis的高可用集群架構相對更復雜,一般不是很推薦。
⑵ 怎麼在java中使用redis
public class RedisListJava { public static void main(String[] args) { //連接本地的 Redis 服務 Jedis jedis = new Jedis("localhost"); System.out.println("Connection to server sucessfully"); //存儲數據到列表中 jedis.lpush("tutorial-list", "Redis"); jedis.lpush("tutorial-list", "Mongodb"); jedis.lpush("tutorial-list", "Mysql"); // 獲取存儲的數據並輸出 List<String> list = jedis.lrange("tutorial-list", 0 ,5); for(int i=0; i<list.size(); i++) { System.out.println("Stored string in redis:: "+list.get(i)); } }}
⑶ java操作redis有哪些方法
電腦安裝Redis,然後通過JRedis(jar包)下的JRedis redis = new JRedis(address,port);就可以操作了,比連接資料庫還簡單,如果是windows的話 建議裝虛擬機用linux安裝redis,其他的只要你懂redis,用java操作redis太簡單了
⑷ 誰有好用的Java使用redis的封裝的示例
Java連接redis的使用示例
Redis是開源的key-value存儲工具,redis通常用來存儲結構化的數據,因為redis的key可以包含String、hash、listset和sorted
list。
Redisclient支持多種語言,包括:c、C++、C#、php、java、python、go等語言,根據自己的開發語言,選擇合適的redis
client版本類型即可。我是使用java語言開發的,針對java語言,redis
client也提供了多種客戶端支持,按照推薦類型依次是:Jedis、Redisson、JRedis、JDBC-Redis、RJC、redis-protocol、aredis、lettuce。前兩種類型是比較推薦的,我們採用了Redisson類型版本作為redisclient的使用。
Redisson版的redis可發工程搭建
1.
新建maven工程
2.
在pom.xml文件的dependencies節點下增加如下內容:
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
3.
保存pom.xml後,等eclispe工程構建完成後即可進行開發了
開發示例
下面是演示連接redis伺服器、保存讀取concurrentMap對象、保存讀取set對象和保存讀取Queue對象的示例代碼,代碼比較簡單,這里就不再詳細講解了,代碼如下:
[java]
view
plain
package
com.my.test.redis;
import
java.util.Queue;
import
java.util.Set;
import
java.util.concurrent.ConcurrentMap;
import
org.redisson.Config;
import
org.redisson.Redisson;
public
class
RedisExample
{
/**
*
@param
args
*/
public
static
void
main(String[]
args)
{
//
1.初始化
Config
config
=
new
Config();
config.setConnectionPoolSize(10);
config.addAddress("127.0.0.1:6379");
Redisson
redisson
=
Redisson.create(config);
System.out.println("reids連接成功...");
//
2.測試concurrentMap,put方法的時候就會同步到redis中
ConcurrentMap<String,
Object>
map
=
redisson.getMap("FirstMap");
map.put("wuguowei",
"男");
map.put("zhangsan",
"nan");
map.put("lisi",
"女");
ConcurrentMap
resultMap
=
redisson.getMap("FirstMap");
System.out.println("resultMap=="
+
resultMap.keySet());
//
2.測試Set集合
Set
mySet
=
redisson.getSet("MySet");
mySet.add("wuguowei");
mySet.add("lisi");
Set
resultSet
=
redisson.getSet("MySet");
System.out.println("resultSet==="
+
resultSet.size());
//3.測試Queue隊列
Queue
myQueue
=
redisson.getQueue("FirstQueue");
myQueue.add("wuguowei");
myQueue.add("lili");
myQueue.add("zhangsan");
myQueue.peek();
myQueue.poll();
Queue
resultQueue=redisson.getQueue("FirstQueue");
System.out.println("resultQueue==="+resultQueue);
//
關閉連接
redisson.shutdown();
}
}
⑸ java使用redis時不時的報沒有可用的鏈接
出現這種問題從以下幾個方面排查:
1、網路不穩定,這種情況只會出現在調用機器和redis伺服器不在同一台機器的情況,如果調用本機redis請忽略。
2、使用了連接池,並發較大,連接池配置的最大連接數過小,客戶端從連接池獲取連接時,如果沒有可用連接就阻塞當前線程直到有可用連接,等待時間超過配置的超時時間後會拋出連接超時異常。
3、同樣是使用連接池的情況,從連接池獲取連接,使用完成後沒有釋放連接,導致連接池鏈接耗盡。
4、還有可能是硬體性能瓶頸,比如單節點的redis,但是需要支持特別大的並發量,無論怎麼優化配置都是徒勞的,這種情況就需要考慮做讀寫分離,搭建redis集群等,
⑹ java怎麼實現redis分布式鎖
Redis有一系列的命令,特點是以NX結尾,NX是Not eXists的縮寫,如SETNX命令就應該理解為:SET if Not eXists。這系列的命令非常有用,這里講使用SETNX來實現分布式鎖。
用SETNX實現分布式鎖
利用SETNX非常簡單地實現分布式鎖。例如:某客戶端要獲得一個名字foo的鎖,客戶端使用下面的命令進行獲取:
SETNX lock.foo <current Unix time + lock timeout + 1>
如返回1,則該客戶端獲得鎖,把lock.foo的鍵值設置為時間值表示該鍵已被鎖定,該客戶端最後可以通過DEL lock.foo來釋放該鎖。
如返回0,表明該鎖已被其他客戶端取得,這時我們可以先返回或進行重試等對方完成或等待鎖超時。
解決死鎖
上面的鎖定邏輯有一個問題:如果一個持有鎖的客戶端失敗或崩潰了不能釋放鎖,該怎麼解決?我們可以通過鎖的鍵對應的時間戳來判斷這種情況是否發生了,如果當前的時間已經大於lock.foo的值,說明該鎖已失效,可以被重新使用。
發生這種情況時,可不能簡單的通過DEL來刪除鎖,然後再SETNX一次,當多個客戶端檢測到鎖超時後都會嘗試去釋放它,這里就可能出現一個競態條件,讓我們模擬一下這個場景:
C0操作超時了,但它還持有著鎖,C1和C2讀取lock.foo檢查時間戳,先後發現超時了。
C1 發送DEL lock.foo
C1 發送SETNX lock.foo 並且成功了。
C2 發送DEL lock.foo
C2 發送SETNX lock.foo 並且成功了。
這樣一來,C1,C2都拿到了鎖!問題大了!
幸好這種問題是可以避免D,讓我們來看看C3這個客戶端是怎樣做的:
C3發送SETNX lock.foo 想要獲得鎖,由於C0還持有鎖,所以Redis返回給C3一個0
C3發送GET lock.foo 以檢查鎖是否超時了,如果沒超時,則等待或重試。
反之,如果已超時,C3通過下面的操作來嘗試獲得鎖:
GETSET lock.foo <current Unix time + lock timeout + 1>
通過GETSET,C3拿到的時間戳如果仍然是超時的,那就說明,C3如願以償拿到鎖了。
如果在C3之前,有個叫C4的客戶端比C3快一步執行了上面的操作,那麼C3拿到的時間戳是個未超時的值,這時,C3沒有如期獲得鎖,需要再次等待或重試。留意一下,盡管C3沒拿到鎖,但它改寫了C4設置的鎖的超時值,不過這一點非常微小的誤差帶來的影響可以忽略不計。
注意:為了讓分布式鎖的演算法更穩鍵些,持有鎖的客戶端在解鎖之前應該再檢查一次自己的鎖是否已經超時,再去做DEL操作,因為可能客戶端因為某個耗時的操作而掛起,操作完的時候鎖因為超時已經被別人獲得,這時就不必解鎖了。
示例偽代碼
根據上面的代碼,我寫了一小段Fake代碼來描述使用分布式鎖的全過程:
# get lock
lock = 0
while lock != 1:
timestamp = current Unix time + lock timeout + 1
lock = SETNX lock.foo timestamp
if lock == 1 or (now() > (GET lock.foo) and now() > (GETSET lock.foo timestamp)):
break;
else:
sleep(10ms)
# do your job
do_job()
# release
if now() < GET lock.foo:
DEL lock.foo
是的,要想這段邏輯可以重用,使用python的你馬上就想到了Decorator,而用Java的你是不是也想到了那誰?AOP + annotation?行,怎樣舒服怎樣用吧,別重復代碼就行。
⑺ java 中redis 如何使用
這是我之前寫的代代碼,可以參考一下:
importjava.util.Set;
importcom.google.gson.Gson;
importredis.clients.jedis.Jedis;
importredis.clients.jedis.JedisPool;
importredis.clients.jedis.JedisPoolConfig;
publicclassApp{
publicstaticvoidmain(String[]args){
JedisPoolConfigconfig=newJedisPoolConfig();
config.setMaxIdle(5);
config.setMaxWaitMillis(10000);
config.setTestOnBorrow(false);
JedisPooljedisPool=newJedisPool(config,"127.0.0.1",6379);
Jedisjedis=jedisPool.getResource();
jedis.flushDB();
jedis.set("name","Tom");
Useruser=newUser(1,"Tom","User");
Gsongson=newGson();
Stringjson=gson.toJson(user);
jedis.set("user1",json);
Set<String>keys=jedis.keys("*");
for(Stringkey:keys){
System.out.println(key);
}
}
}
如果有疑問,可以隨時追問。
⑻ java redis有什麼作用
Java連接redis的使用示例 Redis是開源的key-value存儲工具,redis通常用來存儲結構化的數據,因為redis的key可以包含String、hash、listset和sorted list。
⑼ java 操作redis,怎麼讓元素按照自己想要的
首先HashMap是無序的,想要有序可以用TreeMap,加入元素後自行排序,但是Map是鍵值對,它就算排序也是按key排序的,和元素沒關系,如果你期望的是元素的排序,建議使用TreeSet,建立TreeSet的時候指定一個comparator.如果確定可以使用TreeSet你可以追問,如果不用,HashMap不能排序這是你要的答案