redis开发小结

随着缓存在web服务中用的越来越广泛,redis可以说成为了目前最流行的NoSQL数据库!redis与memcached最大的不同在于redis支持更多的数据类型,包括string、hash、list、set、sorted list等,所以redis的发展非常迅速,很多公司已将memcached替换为redis。我也做了一些redis的开发,现做一些小结。

1. redis常用配置

daemonize no     //Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程

     pidfile /var/run/redis.pid    //当Redis以守护进程方式运行时,可以通过pidfile指定pid写入的文件

     port 6379  //指定Redis监听端口,默认端口为6379

     bind 127.0.0.1  //只接受来至某IP的请求

     save <seconds> <changes>   //指定在多长时间内,有多少次更新操作

     rdbcompression yes  //指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大

     dbfilename dump.rdb   //指定本地数据库文件名,默认值为dump.rdb

     dir ./data    //指定本地数据库存放目录

     tcp-keepalive 60 //主动检测客户端链接是否正常,官方建议60s

     slaveof <masterip> <masterport>   // 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步

     appendonly no  //指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。

     appendfilename appendonly.aof  //指定更新日志文件名,默认为appendonly.aof

     vm-enabled no  //指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中

2.  redis.clients.jedis.exceptions.JedisException: Could not return the resource to the pool  异常

     在开发中我遇到这个异常,翻来覆去看代码都没找到哪里写错了,最后无奈重启机器,把redis也重新启动,结果又不抛异常了!

     哦,我才发现原来我在redis的同一个数据库中即放了String字符串,又想放byte[]造成的,记住同一个数据库要放同一种数据结构!

3.   Spring 与jedis整合

      Jedis 是 redis官方首选的 Java 客户端开发包。虽然spring-data-redis封装的更好,但本人还是喜欢直接使用jedis,这样灵活性更好。下面介绍spring与jedis配置:

spring配置文件配置bean,主要是在spring容器中创建jedis需要的对象

    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
            <property name="maxTotal" value="50" />
            <property name="testOnBorrow" value="true" />
            <property name="maxIdle" value="10" />
            <property name="maxWaitMillis" value="1000" />
    </bean> 

    <bean  id="shardedJedisPool"  class="redis.clients.jedis.ShardedJedisPool">
         <constructor-arg  index="0"  ref="jedisPoolConfig" />
         <constructor-arg index="1">
             <list>
                  <bean class="redis.clients.jedis.JedisShardInfo">
                       <constructor-arg
                           index="0"
                           value="127.0.0.1" />
                       <constructor-arg
                           index="1"
                           value="6379"
                           type="int" />
                     </bean>
            </list>
        </constructor-arg>
    </bean>

接下来就可以在java持久层或服务层自动注入jedis对象:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

@Repository
public class RedisDao {
    @Autowired
    private ShardedJedisPool pool;

    public String getString(String key){
        ShardedJedis jedis = null;
        try {
            jedis = pool.getResource();
            return jedis.get(key);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            pool.returnResourceObject(jedis);
        }
        return null;
    }

}

4.   redis监控

      查看redis内存使用情况:

         用redis-cli连接redis,用info memory查看内存占用情况

$ ./src/redis-cli
127.0.0.1:6379> info memory
# Memory
used_memory:37583536
used_memory_human:35.84M
used_memory_rss:40407040
used_memory_peak:38312160
used_memory_peak_human:36.54M
used_memory_lua:35840
mem_fragmentation_ratio:1.08
mem_allocator:jemalloc-3.6.0
used_memory:redis当前数据使用的内存,可能包括SWAP虚拟内存。used_memory_rss:redis当前占用的物理内存,与top命令查看的进程占用内存一致。mem_fragmentation_ratio:used_memory_rss/used_memory比值,这个值比较重要,当

mem_fragmentation_ratio<1时,说明redis已经在使用SWAP,运行性能会受到很大影响。通常情况下该值比1大一些。
如何避免mem_fragmentation_ratio<1?需要在redis.conf文件中正确配置三个参数:maxmemory、maxmemory-policy、maxmemory-samples。maxmemory:默认为0,在这种情况下,redis会尽可能使用物理内存,用完后尽可能使用虚拟内存。当使用SWAP时,性能会急剧下降,极限情况下redis可能会宕机。这是运行环境中redis服务宕机的主要原因。因此在生产环境中一定要给该参数设置一个合理的值。当内存使用达到阀值时,redis会使用清除策略腾出内存。maxmemory-policy:定义清除策略。

5. redis主从复制   redis复制支持主从复制,一个主苦可以挂多个从库,支持读写分离。同时从库可以再挂从库形成级联复制。   

 

    

     

时间: 2024-12-28 00:04:02

redis开发小结的相关文章

iOS线程开发小结

/* 方法名决定是否开启新线程(async,sync),队列类型(全局队列,串行队列)决定开启多少条线程 1.快速线程调用 *开启后台线程执行任务 [self performSelectorInBackground:@selector(test) withObject:nil]; *回到主线程执行任务 [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 2.GCD

ASP.NET Redis 开发 入门

ASP.NET Redis 开发 文件并发(日志处理)--队列--Redis+Log4Net Redis简介 Redis是一个开源的,使用C语言编写,面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景.Redis纯粹为应用而产生,它是一个高性能的key-value数据库,并且提供了多种语言的API 性能测试结果表示SET操作每秒钟可达110000次,GET操作每秒81000次(当然不同的服务器配置性能不同). redis目前提供五种数据类型:str

PHP服务器文件管理器开发小结(总结):总结、索引和源代码

PHP服务器文件管理器的开发经过前一阶段的介绍基本完成了功能搭建,包括目录的检索.增加.删除.重命名,文件的增加.浏览.修改.重命名.移动,以及文件的上传和下载等功能.本文对前一阶段工作的相关博文进行索引,并提供源代码供有兴趣的同学一同讨论. PHP服务器文件管理器开发小结(一):功能规划 本节讨论了文件管理器的目标功能和运行环境. PHP服务器文件管理器开发小结(二):版面设计和css 本节讨论了页面布局所需的css内容,并介绍了引入jQuery和jQueryUI的方法. PHP服务器文件管理

Windows PHP 环境下 Redis开发环境搭建

1.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hashs(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redi

XXX系统开发小结(SSH+Jquery EasyUI)

一.项目总体介绍 前一段时间的工作中,笔者大概用了两三个月开发了一个Web管理信息系统,使用的框架集为Struts2.3.1+Spring3.0+Hibernate3+Jquery EasyUI1.3.5,系统业务逻辑并不复杂,完成数据的采集(以问卷的形式).计算处理和形成报告发布.EasyUI是一个很优秀的JS UI框架,使用简单方便,效果也还可以,是UI效果和带宽速度之间的一个折中之选.系统中还有新闻发布模块,用到了富文本编辑器,在比较了很多插件之后,选择了kindeditor,原因很简单,

arcserver开发小结(三)

一.关于网络数据集的制作 由于要做实现网络分析的功能,而手中却没有网络数据集,关于网络数据集的制作,网上也有不少的资料.我参考的是ESRI为我们提供的帮助文档(Network_Analyst_Tutorial.pdf,该文档位于C:\Program Files\ArcGIS\Documentation,当然这个路径会随着ArcGIS安装路径的不同而有所不同),参照里面的做了下,我觉得最重要的是当你一步步NEXT后生成了.ND文件(网络数据集network dataset)之后,这里还没完,务必要

arcserver开发小结(一)

一.关于属性查询 由于要做属性查询,又重新玩起了arcmap中的select by attribute,有很多自己当初玩弄arcmap多年还不是很清楚的东西 1,字段名 (1)file geodatabase, shapefile, dBase table, coverage, INFO table-- "AREA" (2)personal geodatabase--[AREA] (3)ArcSDE geodatabase--AREA (4)Excel file (.xls file)

arcserver开发小结(二)

一.关于服务器上下文 1,服务器上下文(ServerContext)本质上是一个GIS服务器上的进程,它是服务器端编程的起点. 2,只有本地资源才能得到服务器上下文,通常得到服务器上下文的主线是: MapResourceLocal——>ServerContextInfo——>ServerContext 3,在gis服务器上创建对象,只能通过ServerContext的CreateObject方法,而不能用new关键字,new关键字创建的是在本机上创建,而非gis服务器上. 4,CreateOb

OneDrive模块开发小结(二)--- 性能及其他问题解决方案

继上篇OneDrive模块开发小结(一)--- 获取登陆时email http://blog.csdn.net/vic_fang/article/details/23282311 之后,再做一个阶段性小结 1. 关于同步方法和异步方法 onedrive的demon项目中提供了两种方式的api,以获取文件详细信息为例:get(String id), getAsync(String id, LiveOperationListener listener).get(String id)方式是纯异步的,