zoukankan      html  css  js  c++  java
  • redis

    1、Redis简介:

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

    Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。

    Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

    redis的官网地址,非常好记,是redis.io。(特意查了一下,域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地.

    2、windows下载安装使用redis

    百度云下载链接:http://pan.baidu.com/s/1kUL0aIN 密码:rlvu

    下载文件中包含32位和64位,可根据不同版本需求使用(在这里介绍使用64位),64位压缩包解压后文件显示:

    运行redis服务:鼠标双击redis-server.exe文件,出现:

    到这一步redis就启动成功啦,然后鼠标双击执行解压文件中的redis-cli.exe文件连接redis服务器:

    连接成功后执行简单set和get命令,命令格式:set key value,get key

    3.在多线程下使用redis

    在不同的线程中使用相同的Jedis实例会发生奇怪的错误。但是创建太多的实现也不好因为这意味着会建立很多sokcet连接,也会导致奇怪的错误发生。单一Jedis实例不是线程安全的。为了避免这些问题,可以使用JedisPool, JedisPool是一个线程安全的网络连接池。可以用JedisPool创建一些可靠Jedis实例,可以从池中拿到Jedis的实例。这种方式可以解决那些问题并且会实现高效的性能,jedis. 
    初始化JedisPool:

    package demo.mysql.util;
    
    import redis.clients.jedis.Jedis;  
    import redis.clients.jedis.JedisPool;  
    import redis.clients.jedis.JedisPoolConfig;  
      
    /**    
     * Redis操作接口 
     * 
     * @author 夏中伟
     * @version 1.0 2016-6-19    
     */  
    public class RedisApi {  
        private static JedisPool pool = null;  
          
        /** 
         * 构建redis连接池 
         *  
         * @param ip 
         * @param port 
         * @return JedisPool 
         */  
        public static JedisPool getPool() {  
            if (pool == null) {  
                JedisPoolConfig config = new JedisPoolConfig();  
                //控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;  
                //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。  
                config.setMaxTotal(-1);//setMaxActive(500);  
                //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。  
                config.setMaxIdle(5);  
                //表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;  
                config.setMaxWaitMillis(1000*1000);//setMaxWait(1000 * 100);  
                //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;  
                config.setTestOnBorrow(true);  
                //在空闲时检查有效性, 默认false
                config.setTestWhileIdle(true);
                //连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
                config.setBlockWhenExhausted(true);
                pool = new JedisPool(config, "127.0.0.1", 6379);  
            }  
            return pool;  
        }  
          
        /** 
         * 返还到连接池 
         *  
         * @param pool  
         * @param redis 
         */  
        public static void returnResource(JedisPool pool, Jedis redis) {  
            if (redis != null) {  
                pool.returnResource(redis);  
            }  
        }  
          
        /** 
         * 获取数据 
         *  
         * @param key 
         * @return 
         */  
        public static String get(String key){  
            String value = null;  
              
            JedisPool pool = null;  
            Jedis jedis = null;  
            try {  
                pool = getPool();  
                jedis = pool.getResource();  
                value = jedis.get(key);  
            } catch (Exception e) {  
                //释放redis对象  
                pool.returnBrokenResource(jedis);  
                e.printStackTrace();  
            } finally {  
                //返还到连接池  
                returnResource(pool, jedis);  
            }  
              
            return value;  
        }  
    }   

    main方法测试:(连接redis前先执行redis-server.exe启动服务)

    package demo.mysql.redisTest;
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import demo.mysql.util.RedisApi;
    
    
    public class redisTest {
    
    	public static void main(String[] args) {
    		System.out.println(RedisApi.get("aa"));
    		JedisPool jedisPool = RedisApi.getPool();
    		Jedis jedis = null;
    		try {
    			jedis = jedisPool.getResource();
    			System.out.println(jedis.set("izhongwei", "ixiazhongwei"));
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (jedis != null) {
    				jedis.close();
    			}
    		}
    		
    	}
    
    }
    

    4.事物

    redis中的事物(transaction)是一组命令的集合。事物同命令一样是redis的最小执行单位。

    redis中事物使用watch命令;watch命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事物就不会执行,监控一直持续到EXEC命令(事物中的命令是在exec之后才执行的,所以在multi命令之后可以修改watch监控的键值)。

    redis 127.0.0.1:6379> set key 1
    OK
    redis 127.0.0.1:6379> watch key
    OK
    redis 127.0.0.1:6379> set key 2
    OK
    redis 127.0.0.1:6379> multi
    OK
    redis 127.0.0.1:6379> set key 3
    QUEUED
    redis 127.0.0.1:6379> exec
    (nil)
    redis 127.0.0.1:6379> get key
    "2"

    执行exec后:

    redis 127.0.0.1:6379> set key 1
    OK
    redis 127.0.0.1:6379> watch key
    OK
    redis 127.0.0.1:6379> set key 2
    OK
    redis 127.0.0.1:6379> multi
    OK
    redis 127.0.0.1:6379> set key 3
    QUEUED
    redis 127.0.0.1:6379> exec
    (nil)
    redis 127.0.0.1:6379> multi
    OK
    redis 127.0.0.1:6379> set key 4
    QUEUED
    redis 127.0.0.1:6379> exec
    1) OK
    redis 127.0.0.1:6379> get key
    "4"

    5.实现缓存,合理设置redis缓存时间

    具体设置方法:修改配置文件袋maxmemory参数,现在redis最大可用内存大小(单位是字节),当超出了这个限制时redis会依据maxmemory-policy参数指定的策略来删除不需要的键直到reid占用内存小于指定内存。

     maxmemeory-policy支持的规则中,可以设置LRU(Lease Recently Used)算法即,“最近最少使用”,其认为最近最少使用的键在未来一段时间也不会被用到,即当前空间这些键可以被删除的。

    6.排序

    redis > sort key

    list存储按照字典类型使用> sort key alpha

    redis>sort key desc  // 实现查出结果降序

    redis> sort key dec limit 1 10  // 查询降序的前10个

    redis>sort key by id // 根据id排序

    源码下载:https://github.com/ablejava/JDBC

     

  • 相关阅读:
    ruby 中 raise 抛出异常
    ruby中attr_accessor方法的理解
    Redis实现分布式缓存
    应用服务器集群概念
    反向代理和正向代理区别
    如何限制同一用户同时登录多台设备?
    Docker 初始
    Java 的反射机制你了解多少?
    JWT 实战
    判断 uniapp 项目运行到 什么机型
  • 原文地址:https://www.cnblogs.com/ablejava/p/5598534.html
Copyright © 2011-2022 走看看