Java操作redis
Redis 作为服务器缓存,用处比较多。本文使用 java 操作 redis,对操作进行简单的封装,并介绍如何将其集成到 spring 中,最后介绍 redis 分页查询。
首先定义操作接口,为 redis 的单机操作和集群操作提供标准。
public interface JedisClient { void set(String key, String value);Set<String> zrevrange(String key, long start, long end);//递减 }String get(String key); </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> hset(String hkey, String key, String value); String hget(String hkey, String key); </span><span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> incr(String key); </span><span style="color: rgba(0, 0, 255, 1)">void</span> expire(String key, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> seconds); </span><span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> ttl(String key); </span><span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> del(String key); </span><span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> hdel(String hkey, String key); </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)"> * redis list操作 * * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> name * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> value </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> rpush(String key, String value); </span><span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> lpush(String key, String value); String rpop(String key); String lpop(String key); </span><span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> llen(String key); List</span><String> lrange(String key, <span style="color: rgba(0, 0, 255, 1)">long</span> start, <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> end); </span><span style="color: rgba(0, 0, 255, 1)">long</span> zadd(String key, <span style="color: rgba(0, 0, 255, 1)">double</span><span style="color: rgba(0, 0, 0, 1)"> score, String value); Set</span><String> zrange(String key, <span style="color: rgba(0, 0, 255, 1)">long</span> start, <span style="color: rgba(0, 0, 255, 1)">long</span> end);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">递增</span>
定义单机版实现类
public class JedisClientSingle implements JedisClient { // 注意,JedisPool 这个类型已经在 spring 中注册过了。这种方式直根据类型来注入 @Autowired private JedisPool jedisPool;@Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> set(String key, String value) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); jedis.set(key, value); jedis.close(); } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String get(String key) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); String value </span>=<span style="color: rgba(0, 0, 0, 1)"> jedis.get(key); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> value; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> hset(String hkey, String key, String value) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); jedis.hset(hkey, key, value); jedis.close(); } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String hget(String hkey, String key) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); String value </span>=<span style="color: rgba(0, 0, 0, 1)"> jedis.hget(hkey, key); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> value; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> incr(String key) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); </span><span style="color: rgba(0, 0, 255, 1)">long</span> value =<span style="color: rgba(0, 0, 0, 1)"> jedis.incr(key); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> value; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> expire(String key, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> seconds) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); jedis.expire(key, seconds); jedis.close(); } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> ttl(String key) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); </span><span style="color: rgba(0, 0, 255, 1)">long</span> value =<span style="color: rgba(0, 0, 0, 1)"> jedis.ttl(key); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> value; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> del(String key) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); </span><span style="color: rgba(0, 0, 255, 1)">long</span> result =<span style="color: rgba(0, 0, 0, 1)"> jedis.del(key); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> hdel(String hkey, String key) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); </span><span style="color: rgba(0, 0, 255, 1)">long</span> result =<span style="color: rgba(0, 0, 0, 1)"> jedis.hdel(hkey, key); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> rpush(String key, String value) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); </span><span style="color: rgba(0, 0, 255, 1)">long</span> result =<span style="color: rgba(0, 0, 0, 1)"> jedis.rpush(key, value); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> lpush(String key, String value) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); </span><span style="color: rgba(0, 0, 255, 1)">long</span> result =<span style="color: rgba(0, 0, 0, 1)"> jedis.lpush(key, value); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String rpop(String key) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); String result </span>=<span style="color: rgba(0, 0, 0, 1)"> jedis.rpop(key); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String lpop(String key) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); String result </span>=<span style="color: rgba(0, 0, 0, 1)"> jedis.lpop(key); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> llen(String key) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); </span><span style="color: rgba(0, 0, 255, 1)">long</span> result =<span style="color: rgba(0, 0, 0, 1)"> jedis.llen(key); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> List<String> lrange(String key, <span style="color: rgba(0, 0, 255, 1)">long</span> start, <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> end) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); List</span><String> result =<span style="color: rgba(0, 0, 0, 1)"> jedis.lrange(key, start, end); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">long</span> zadd(String key, <span style="color: rgba(0, 0, 255, 1)">double</span><span style="color: rgba(0, 0, 0, 1)"> score, String value) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); </span><span style="color: rgba(0, 0, 255, 1)">long</span> result =<span style="color: rgba(0, 0, 0, 1)"> jedis.zadd(key, score, value); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> Set<String> zrange(String key, <span style="color: rgba(0, 0, 255, 1)">long</span> start, <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> end) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); Set</span><String> result =<span style="color: rgba(0, 0, 0, 1)"> jedis.zrange(key, start, end); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result; } @Override </span><span style="color: rgba(0, 0, 255, 1)">public</span> Set<String> zrevrange(String key, <span style="color: rgba(0, 0, 255, 1)">long</span> start, <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> end) { Jedis jedis </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisPool.getResource(); Set</span><String> result =<span style="color: rgba(0, 0, 0, 1)"> jedis.zrevrange(key, start, end); jedis.close(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result; }
}
如下是集群操作实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | public class JedisClientCluster implements JedisClient { // 注意,jedisCluster这个类型已经在spring中注册过了。这种方式直接根据类型来注入,不需要进行关闭操作 @Autowired private JedisCluster jedisCluster; @Override public void set(String key, String value) { jedisCluster.set(key, value); } @Override public String get(String key) { return jedisCluster.get(key); } @Override public void hset(String hkey, String key, String value) { jedisCluster.hset(hkey, key, value); } @Override public String hget(String hkey, String key) { return jedisCluster.hget(hkey, key); } @Override public long incr(String key) { return jedisCluster.incr(key); } @Override public void expire(String key, int seconds) { jedisCluster.expire(key, seconds); } @Override public long ttl(String key) { return jedisCluster.ttl(key); } @Override public long del(String key) { return jedisCluster.del(key); } @Override public long hdel(String hkey, String key) { return jedisCluster.hdel(hkey, key); } @Override public long rpush(String key, String value) { return jedisCluster.rpush(key, value); } @Override public long lpush(String key, String value) { return jedisCluster.lpush(key, value); } @Override public String rpop(String key) { return jedisCluster.rpop(key); } @Override public String lpop(String key) { return jedisCluster.lpop(key); } @Override public long llen(String key) { return jedisCluster.llen(key); } @Override public List<String> lrange(String key, long start, long end) { return jedisCluster.lrange(key, start, end); } @Override public long zadd(String key, double score, String value) { return jedisCluster.zadd(key, score, value); } @Override public Set<String> zrange(String key, long start, long end) { return jedisCluster.zrange(key, start, end); } @Override public Set<String> zrevrange(String key, long start, long end) { return jedisCluster.zrange(key, start, end); } } |
jedis 相关的 bean 在 spring 中的配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!-- <property name="maxIdle" value="300" /> --> <!-- 最大能够保持 idel 状态的对象数 --> <!-- <property name="maxTotal" value="60000" /> --><!-- 最大分配的对象数 --> <!-- <property name="testOnBorrow" value="true" /> --> <!-- 当调用 borrow Object 方法时,是否进行有效性检查 --> </bean> <!-- jedis 客户端单机版,开发的时候,都是用单机版 --> <bean id="redisClientSingle" class="redis.clients.jedis.JedisPool"> <constructor-arg name="poolConfig" ref="jedisPoolConfig" /> <constructor-arg name="host" value="192.168.1.1"></constructor-arg> <constructor-arg name="port" value="6379"></constructor-arg> <constructor-arg name="timeout" value="2000" type="int"></constructor-arg> <constructor-arg name="password" value="xxx"></constructor-arg> </bean><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">bean </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="jedisClientSingle"</span><span style="color: rgba(255, 0, 0, 1)"> class</span><span style="color: rgba(0, 0, 255, 1)">="org.redis.impl.JedisClientSingle"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">bean</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> jedis客户端集群版,生产环境使用 </span><span style="color: rgba(0, 128, 0, 1)">--></span> <span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> <bean id="redisClientCluster" class="redis.clients.jedis.JedisCluster"> <constructor-arg name="nodes"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.128"></constructor-arg> <constructor-arg name="port" value="7001"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.128"></constructor-arg> <constructor-arg name="port" value="7002"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.128"></constructor-arg> <constructor-arg name="port" value="7003"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.128"></constructor-arg> <constructor-arg name="port" value="7004"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.128"></constructor-arg> <constructor-arg name="port" value="7005"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.128"></constructor-arg> <constructor-arg name="port" value="7006"></constructor-arg> </bean> </set> </constructor-arg> <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg> </bean> <bean id="jedisClientCluster" class="org.redis.impl..JedisClientCluster"></bean> </span><span style="color: rgba(0, 128, 0, 1)">--></span>
</beans>
java 中 redis 分页查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | package common.model; import java.util.ArrayList; import java.util.List; public class PageRedis<A> { private int totalNum; // 总行数 private int totalPage; // 总页数 private int pageIndex; // 当前页数 private int pageSize; // 每页几行 private List<A> rows; public PageRedis() { } public int getTotalPage() { return totalPage; } public int getPageIndex() { return pageIndex; } public void setPageIndex( int pageIndex) { this .pageIndex = pageIndex; } public int getPageSize() { return pageSize; } public void setPageSize( int pageSize) { this .pageSize = pageSize; } public int getTotalNum() { return totalNum; } public void setTotalNum( int totalNum) { this .totalNum = totalNum; } // 设置总页数 public List<A> getRows() { return rows; } public void setRows(List<A> rows) { this .rows = rows; } public void setTotalPage() { // 如果总行数整除每页的行数 if ( this .getTotalNum() % this .getPageSize() == 0 ) { this .totalPage = this .getTotalNum() / this .getPageSize(); } else { this .totalPage = this .getTotalNum() / this .getPageSize() + 1 ; } } public <T> List<T> getPage(List<T> list) { List<T> sub = new ArrayList<T>(); // 当前页的起始记录(非最后一页) int start = ( this .getPageIndex() - 1 ) * this .getPageSize(); // 当前页的截止记录(非最后一页) int end = this .getPageIndex() * this .getPageSize(); // 最后一页 int endOfLast = ( this .getPageIndex() - 1 ) * this .getPageSize() + this .getTotalNum() % this .getPageSize(); // 如果说,当前页数等于总页数 并且 总行数除以每页几行不能整除 if ( this .getPageIndex() == this .getTotalPage() && this .getTotalNum() % this .getPageSize() != 0 ) { for ( int i = start; i < endOfLast; i++) { if (i < list.size()) { sub.add(list.get(i)); } } } else { for ( int i = start; i < end; i++) { if (i < list.size()) { sub.add(list.get(i)); } } } return sub; } public static void main(String[] args) { /*List<Integer> list = new LinkedList<Integer>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); PageRedis page = new PageRedis(); page.setTotalNum(list.size()); page.setPageSize(4); page.setPageIndex(3); page.setTotalPage(); List<Integer> sub = page.getPage(list); System.out.println(sub);*/ } } |
注意,上文中有几点是个人认为比较麻烦的
1.spring 集成含密码的 redis
2. 利用 redis 的 list 和 sortset 实现分页查询
有问题欢迎讨论