zoukankan      html  css  js  c++  java
  • Java操作redis

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

    有问题欢迎讨论

  • 相关阅读:
    mac os x 之通过远程主机在nginx上部署web静态页面
    基于jQuery UI的调色板插件推荐colorpicker
    Mac 访问隐藏文件方法! 网上方法在我电脑上都不可用!
    JavaScript设计模式学习之单例模式
    由一篇博文做出的代码,不用Math.round()如何实现其功能
    mac os x之解决npm安装包失败,或者nodejs工程缺少依赖
    用nginx的反向代理机制解决前端跨域问题
    mac之os x系统下搭建nodejs+express4.x+mongodb+gruntjs整套前端工程
    sourcetree window10 闪退
    滚动条自定义样式
  • 原文地址:https://www.cnblogs.com/supertonny/p/7158108.html
Copyright © 2011-2022 走看看