您的位置:首页 > 数据库 > Redis

Java操作redis

2017-07-12 23:06 393 查看
Redis作为服务器缓存,用处比较多。本文使用java操作redis,对操作进行简单的封装,并介绍如何将其集成到spring中,最后介绍redis分页查询。

首先定义操作接口,为redis的单机操作和集群操作提供标准。

public interface JedisClient
{
void set(String key, String value);

String get(String key);

void hset(String hkey, String key, String value);

String hget(String hkey, String key);

long incr(String key);

void expire(String key, int seconds);

long ttl(String key);

long del(String key);

long hdel(String hkey, String key);

/**
* redis list操作
*
* @param name
* @param value
*/
long rpush(String key, String value);

long lpush(String key, String value);

String rpop(String key);

String lpop(String key);

long llen(String key);

List<String> lrange(String key, long start, long end);

long zadd(String key, double score, String value);

Set<String> zrange(String key, long start, long end);//递增

Set<String> zrevrange(String key, long start, long end);//递减
}


定义单机版实现类

public class JedisClientSingle implements JedisClient
{
// 注意,JedisPool这个类型已经在spring中注册过了。这种方式直根据类型来注入
@Autowired
private JedisPool jedisPool;

@Override
public void set(String key, String value)
{
Jedis jedis = jedisPool.getResource();
jedis.set(key, value);
jedis.close();
}

@Override
public String get(String key)
{
Jedis jedis = jedisPool.getResource();
String value = jedis.get(key);
jedis.close();
return value;
}

@Override
public void hset(String hkey, String key, String value)
{
Jedis jedis = jedisPool.getResource();
jedis.hset(hkey, key, value);
jedis.close();
}

@Override
public String hget(String hkey, String key)
{
Jedis jedis = jedisPool.getResource();
String value = jedis.hget(hkey, key);
jedis.close();
return value;
}

@Override
public long incr(String key)
{
Jedis jedis = jedisPool.getResource();
long value = jedis.incr(key);
jedis.close();
return value;
}

@Override
public void expire(String key, int seconds)
{
Jedis jedis = jedisPool.getResource();
jedis.expire(key, seconds);
jedis.close();
}

@Override
public long ttl(String key)
{
Jedis jedis = jedisPool.getResource();
long value = jedis.ttl(key);
jedis.close();
return value;
}

@Override
public long del(String key)
{
Jedis jedis = jedisPool.getResource();
long result = jedis.del(key);
jedis.close();
return result;
}

@Override
public long hdel(String hkey, String key)
{
Jedis jedis = jedisPool.getResource();
long result = jedis.hdel(hkey, key);
jedis.close();
return result;
}

@Override
public long rpush(String key, String value)
{
Jedis jedis = jedisPool.getResource();
long result = jedis.rpush(key, value);
jedis.close();
return result;
}

@Override
public long lpush(String key, String value)
{
Jedis jedis = jedisPool.getResource();
long result = jedis.lpush(key, value);
jedis.close();
return result;
}

@Override
public String rpop(String key)
{
Jedis jedis = jedisPool.getResource();
String result = jedis.rpop(key);
jedis.close();
return result;
}

@Override
public String lpop(String key)
{
Jedis jedis = jedisPool.getResource();
String result = jedis.lpop(key);
jedis.close();
return result;
}

@Override
public long llen(String key)
{
Jedis jedis = jedisPool.getResource();
long result = jedis.llen(key);
jedis.close();
return result;
}

@Override
public List<String> lrange(String key, long start, long end)
{
Jedis jedis = jedisPool.getResource();
List<String> result = jedis.lrange(key, start, end);
jedis.close();
return result;
}

@Override
public long zadd(String key, double score, String value)
{
Jedis jedis = jedisPool.getResource();
long result = jedis.zadd(key, score, value);
jedis.close();
return result;
}

@Override
public Set<String> zrange(String key, long start, long end)
{
Jedis jedis = jedisPool.getResource();
Set<String> result = jedis.zrange(key, start, end);
jedis.close();
return result;
}

@Override
public Set<String> zrevrange(String key, long start, long end)
{
Jedis jedis = jedisPool.getResource();
Set<String> result = jedis.zrevrange(key, start, end);
jedis.close();
return result;
}

}


如下是集群操作实现类

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>

<bean id="jedisClientSingle" class="org.redis.impl.JedisClientSingle"></bean>

<!-- jedis客户端集群版,生产环境使用 -->
<!-- <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> -->
</beans>


java中redis分页查询

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实现分页查询

有问题欢迎讨论
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: