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不能排序这是你要的答案