java操作redis redis的事宜
java操作redis redis的事务
1 添加mavcen依赖:
1 pom.xml中增加依赖: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.4.2</version> </dependency>
2 redis java客户端连接工具 jedis
连接配置参数含义简介:
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。 poolConfig.setMaxIdle(10); //控制一个pool最多有多少个jedis实例。 poolConfig.setMaxTotal(100); //表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException; poolConfig.setMaxWaitMillis(10000); //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的; poolConfig.setTestOnBorrow(true);
3 连接方式:
单机单连接方式
单机连接池方式
多机分布式连接池方式
代码如下:
import java.util.ArrayList; import java.util.List; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisShardInfo; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPool; public class TestJedis { String host = "192.168.1.170"; int port = 6379; /** * 单机模式 */ @Test public void testSet() { Jedis jedis = new Jedis(host, port); String result = jedis.set("name", "zm"); System.out.println(result); jedis.close(); } @Test public void testGet(){ Jedis jedis = new Jedis(host, port); String value = jedis.get("name"); System.out.println(value); jedis.close(); } /** * 单机链接池 */ @Test public void testpool(){ JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(100); poolConfig.setMaxIdle(10); poolConfig.setMaxWaitMillis(5000); poolConfig.setTestOnBorrow(true); JedisPool jedisPool = new JedisPool(poolConfig, host,port); Jedis jedis = jedisPool.getResource(); String value = jedis.get("name"); System.err.println(value+"_____pool"); jedisPool.returnResource(jedis); } // 连接redis集群 @Test public void testmorePool(){ JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(100); poolConfig.setMaxIdle(10); poolConfig.setMaxWaitMillis(5000); poolConfig.setTestOnBorrow(true); List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>(); shards.add(new JedisShardInfo(host, port)); /*shards.add(new JedisShardInfo(host, port)); // redis集群机器1 端口1 shards.add(new JedisShardInfo(host, port)); // redis集群机器2 端口2 shards.add(new JedisShardInfo(host, port));*/ // redis集群机器3 端口3 ShardedJedisPool shardedJedisPool = new ShardedJedisPool(poolConfig, shards); ShardedJedis jedis = shardedJedisPool.getResource(); String value = jedis.get("crxy"); System.out.println(value+"_______morepool"); shardedJedisPool.returnResource(jedis); } }
2 事务:
2.1)redis的事务(transaction)
redis中的事务是一组命令的集合。事务同命令一样都是redis的最小执行单元。
原理:先将属于一个事务的命令发送给redis,然后再让redis依次执行这些命令,要么都执行,要么都不执行。
应用场景
一组命令必须同时都执行,或者都不执行。
我们想要保证一组命令在执行的过程之中不被其它命令插入。
2.2)命令写法
multi 事务开始
set name zm
set name xin
exec 事务结束,开始执行事务中的命令 如果执行 discard 则放弃事务
2.3)
错误处理
1:语法错误:致命的错误,事务中的所有命令都不会执行
2:运行错误:不会影响事务中其他命令的执行(比如 用错误的命令来操作错误的数据类型),但是那条运行错误的命令讲不会被执行,也更不会回滚
Redis 不支持回滚(roll back)
因为不需要对回滚进行支持,所以redis的内部才可以保持简单且快速
2.4)watch命令
作用:监控一个或者多个键,当被监控的键值被修改后阻止之后的一个事务的执行。
但是不能保证其它客户端不修改这一键值,所以我们需要在事务执行失败后重新执行事务中的命令。
注意:执行完事务的exec命令之后,watch就会取消对所有键值的监控
unwatch:取消监控