• Redis简介以及在项目中的应用


    Redis是一个高性能的key-value型数据库。Redis能读的速度是110000次/s,写的速度是81000次/s ,性能极高。Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的,多个操作支持事务。

    Redis是运行在内存中的,因此速度极快,由于数据是在内存中,关机后数据将丢失,但是redis是支持数据持久化的,将数据保存到磁盘中,重启的时候可以再次加载进行使用。

    1.Redis使用场景:

      数据实时性要求高,数据存储有过期和淘汰特征的,不需要保证弱一致性,逻辑简单的场景。

      具体如下:

      (1)缓存

       缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。

      (2)排行榜

       很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类型能实现各种复杂的排行榜应用。

      (3)计数器

       什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。

      (4)分布式会话

       集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。

      (5)分布式锁

       在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。

     2.Redis数据类型

        string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

        set是无序的String集合,zset是有序的String集合,zset中除了有String类型外,还有double类型并根据double值的大小来进行排序。

    3.在Java中使用Redis

      Jedis是在java中用来操作Redis的工具。

      下载驱动包jedis.jar,并将该驱动包包含在classpath下,同时需具备java环境和redis环境。

      applicationContext.xml中添加 :

         <!-- 读取配置文件信息 -->
          <context:property-placeholder location="classpath:redis.properties" file-encoding="UTF-8" ignore-unresolvable="true"/>
      
         <!-- Jedis 连接池配置 -->
         <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
              <property name="maxTotal" value="${redis.pool.maxTotal}"/>
              <property name="maxIdle" value="${redis.pool.maxIdle}"/>
              <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>
              <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
         </bean>
     
         <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
             <constructor-arg ref="jedisPoolConfig"/>
             <constructor-arg value="${jedis.host}" type="java.lang.String"/>
             <constructor-arg type="int" value="${jedis.port}"/>
         </bean>

     redis.properties:

    # 控制一个pool可分配多少个jedis实例
    redis.pool.maxTotal=1000
    # 控制一个pool最多有多少个状态为idle(空闲)的jedis实例
    redis.pool.maxIdle=200
    # 表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException
    redis.pool.maxWaitMillis=2000
    #在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的
    redis.pool.testOnBorrow=true
    # redis 单机
    # 单机 host
    jedis.host=127.0.0.1
    # 单机 port
    jedis.port=6379

    java类:

    @Autowired
        private JedisPool jedisPool;
    
        public Jedis getJedis() {
            Jedis jedis = this.jedisPool.getResource();
            // 使用index为2的database
            jedis.select(2);
            return jedis;
        }
    
        public void set(String key, String value, int seconds) {
            Jedis jedis = null;
            try {
                jedis = getJedis();
                jedis.setex(key, seconds, value);
                Long exp = jedis.ttl(key);
                if (exp < 0) {
                    throw new RuntimeException("data time out!");19             }
            } catch (Throwable e) {
                logger.error(e.getMessage(), e);
                throw new TokenException(e.getMessage());
            } finally {
                if(jedis != null){jedis.close;}
            }
        }

    4. C#中Redis的使用

       (1)需要的相关dll

         

        (2)在配置文件中添加Redis本地的IP地址和端口号

      

        (3)后台代码中获取IP和端口号,添加获取PooledRedisClientManager实例的方法CreateManager()

    string RedisServerIP = ConfigurationManager.AppSettings["RedisServerIP"].ToString();
    string RedisServerPort = ConfigurationManager.AppSettings["RedisServerPort"].ToString();
    public PooledRedisClientManager CreateManager()
    {
    //支持读写分离,均衡负载,负载均衡需要单独部署
    return new PooledRedisClientManager(new string[] { RedisServerIP + ":" + RedisServerPort }//用于写
             , new string[] { RedisServerIP + ":" + RedisServerPort }//用于读
             , new RedisClientManagerConfig
    {
         MaxWritePoolSize = 10,//“写”链接池链接数
         MaxReadPoolSize = 10,//“写”链接池链接数
         AutoStart = true,
    
          });
    }

       (4)从Redis中读取数据

    PooledRedisClientManager prcm = CreateManager();
    using (IRedisClient Redis = prcm.GetClient())
    {
        string name = Redis.Get<string>("name");
    }

       (5)向Redis中写入数据

    Redis.Set("name","Bryant24");

      因为上面prcm调用的是GetClient()方法,所以Redis可以进行读写操作。如果调用的是GetReadOnlyClient(),则只能进行从redis中读取数据。

       (6)如下图,表示redis连接成功,左边四个是存储的键值对。

         

    5.Redis进阶之主从复制(master-slave模式)

       **主从复制,就是缓存分别存放在主库和从库上,当主库坏了以后,从库代替,实现故障恢复、高可用。

       Redis的master-slave能够提高系统的可用性,master节点写入cache后,会自动同步到slave节点上。

       环境:

          master node: 10.6.144.155:7030

          slave node: 10.6.144.156:7031

       配置:在slave node上slaveof这行加上master node的ip和端口号

                  slaveof  10.6.144.155:7030

                  tip: slave-read-only yes表示slave只读不写

       验证:启动这两台机器,给master节点加一个缓存项:

                 set a "master-cache-data"

                 在slave节点中取出该缓存项:

                 get a

                 如果取到了,说明master上的cache复制到了slave上。

     

    浮躁的人容易问:我到底该学什么;----别问,学就对了; 浮躁的人容易问:JS有钱途吗;----建议你去抢银行; 浮躁的人容易说:我要中文版!我英文不行!----不行?学呀! 浮躁的人分两种:只观望而不学的人;只学而不坚持的人; 浮躁的人永远不是一个高手。
  • 相关阅读:
    Ubuntu16.04更新源后apt-get update报错的解决方法
    安装Ubuntu16.04 64bit系统时出错的解决方案
    采用Python-Qt5制作置顶透明桌面提醒词/座右铭/便签
    如何手动解析Keras等框架保存的HDF5格式的权重文件
    读取yml配置文件中的值
    添加20位随机数,不重复,可以用来作为发票申请流水等功能
    java 从json串中取出某个字段的值
    Spring事务的两种方式
    (附表设计)超级全面的权限系统设计方案
    nfs 测试
  • 原文地址:https://www.cnblogs.com/qianlang/p/10450697.html
Copyright © 2020-2023  润新知