﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-少年阿宾-随笔分类-Redis</title><link>http://www.blogjava.net/stevenjohn/category/53002.html</link><description>那些青春的岁月</description><language>zh-cn</language><lastBuildDate>Thu, 24 Sep 2015 12:57:26 GMT</lastBuildDate><pubDate>Thu, 24 Sep 2015 12:57:26 GMT</pubDate><ttl>60</ttl><item><title>Redis的三种启动方式</title><link>http://www.blogjava.net/stevenjohn/archive/2015/09/10/427258.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 10 Sep 2015 13:02:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/09/10/427258.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/427258.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/09/10/427258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/427258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/427258.html</trackback:ping><description><![CDATA[第一种：直接启动<br />安装：<br /><div>tar zxvf redis-2.8.9.tar.gz</div><div>cd redis-2.8.9</div><div>#直接make 编译</div><div>make</div><div>#可使用root用户执行`make install`，将可执行文件拷贝到/usr/local/bin目录下。这样就可以直接敲名字运行程序了。</div><div>make install</div><div></div>启动：<br /><div>#加上`&amp;`号使redis以后台程序方式运行</div><div>./redis-server &amp;</div>检测：<br /><div>#检测后台进程是否存在</div><div>ps -ef |grep redis</div><div></div><div>#检测6379端口是否在监听</div><div>netstat -lntp | grep 6379</div><div></div><div>#使用`redis-cli`客户端检测连接是否正常</div><div>./redis-cli</div><div>127.0.0.1:6379&gt; keys *</div><div>(empty list or set)</div><div>127.0.0.1:6379&gt; set key "hello world"</div><div>OK</div><div>127.0.0.1:6379&gt; get key</div><div>"hello world"</div><br />停止：<br /><div>#使用客户端</div><div>redis-cli shutdown</div><div>#因为Redis可以妥善处理SIGTERM信号，所以直接kill -9也是可以的</div><div>kill -9 PID</div><br /><br />第二种：通过指定配置文件启动<br /><br /><div>配置文件</div><div>可为redis服务启动指定配置文件，配置文件 redis.conf 在Redis根目录下。</div><div>#修改daemonize为yes，即默认以后台程序方式运行（还记得前面手动使用&amp;号强制后台运行吗）。</div><div>daemonize no</div><div>#可修改默认监听端口</div><div>port 6379</div><div>#修改生成默认日志文件位置</div><div>logfile "/home/futeng/logs/redis.log"</div><div>#配置持久化文件存放位置</div><div>dir /home/futeng/data/redisData<br /><br /></div><div>启动时指定配置文件</div><div>redis-server ./redis.conf</div><div>#如果更改了端口，使用`redis-cli`客户端连接时，也需要指定端口，例如：</div><div>redis-cli -p 6380<br /></div><div>其他启停同 直接启动 方式。配置文件是非常重要的配置工具，随着使用的逐渐深入将显得尤为重要，推荐在一开始就使用配置文件。</div><br /><br /><br />第三种：<br /><div>使用Redis启动脚本设置开机自启动</div><div>启动脚本</div><div></div><div>推荐在生产环境中使用启动脚本方式启动redis服务。启动脚本 redis_init_script 位于位于Redis的 /utils/ 目录下。</div><br /><div>#大致浏览下该启动脚本，发现redis习惯性用监听的端口名作为配置文件等命名，我们后面也遵循这个约定。</div><div>#redis服务器监听的端口</div><div>REDISPORT=6379</div><div>#服务端所处位置，在make install后默认存放与`/usr/local/bin/redis-server`，如果未make install则需要修改该路径，下同。</div><div>EXEC=/usr/local/bin/redis-server</div><div>#客户端位置</div><div>CLIEXEC=/usr/local/bin/redis-cli</div><div>#Redis的PID文件位置</div><div>PIDFILE=/var/run/redis_${REDISPORT}.pid</div><div>#配置文件位置，需要修改</div><div>CONF="/etc/redis/${REDISPORT}.conf"</div><br /><div>配置环境</div><div></div><div>1. 根据启动脚本要求，将修改好的配置文件以端口为名复制一份到指定目录。需使用root用户。</div><div>mkdir /etc/redis</div><div>cp redis.conf /etc/redis/6379.conf</div><div>&nbsp;2. 将启动脚本复制到/etc/init.d目录下，本例将启动脚本命名为redisd（通常都以d结尾表示是后台自启动服务）。</div><div>cp redis_init_script /etc/init.d/redisd</div><br /><div>&nbsp;3. &nbsp;设置为开机自启动</div><div></div><div>此处直接配置开启自启动 chkconfig redisd on 将报错误： service redisd does not support chkconfig&nbsp;</div><div>参照 此篇文章 ，在启动脚本开头添加如下两行注释以修改其运行级别：</div><div>#!/bin/sh</div><div># chkconfig: &nbsp; 2345 90 10</div><div># description: &nbsp;Redis is a persistent key-value database</div><div>#</div><div>&nbsp;再设置即可成功。</div><br /><br /><div>#设置为开机自启动服务器</div><div>chkconfig redisd on</div><div>#打开服务</div><div>service redisd start</div><div>#关闭服务</div><div>service redisd stop</div><br /><br /><div>http://www.tuicool.com/articles/aQbQ3u</div><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/427258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-09-10 21:02 <a href="http://www.blogjava.net/stevenjohn/archive/2015/09/10/427258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>redis和memcached比较</title><link>http://www.blogjava.net/stevenjohn/archive/2015/04/05/424127.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sat, 04 Apr 2015 21:45:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/04/05/424127.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/424127.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/04/05/424127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/424127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/424127.html</trackback:ping><description><![CDATA[1、线程问题<br /><div>&nbsp; &nbsp; 由于Redis只使用单核，而Memcached可以使用多核，所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中，Memcached性能要高于Redis，虽然Redis最近也在存储大数据的性能上进行优化，但是比起 Memcached，还是稍有逊色。<br /><p>因为 Redis 的操作都非常快速&#8212;&#8212;它的数据全部在内存里，完全不需要访问磁盘。至于并发，Redis 使用多路 I/O  复用技术，本身的并发效率不成问题。</p> <p>当然，单个 Redis 进程没办法使用多核（任一时刻只能跑在一个 CPU  核心上），但是它本来就不是非常计算密集型的服务。如果单核性能不够用，可以多开几个进程。</p></div><div></div><p>Redis 单线程-多路复用io模型<br /></p>、<div>2、内存使用效率对比：<br /><div>&nbsp; &nbsp; 使用简单的key-value存储的话，Memcached的内存利用率更高，而如果Redis采用hash结构来做key-value存储，由于其组合式的压缩，其内存利用率会高于Memcached。</div><div>3、数据类型：<br /><div>&nbsp; &nbsp; Redis相比Memcached来说，拥有更多的数据结构和并支持更丰富的数据操作，通常在Memcached 里，你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中，这些复杂的操作通常和一般的 GET/SET一样高效。所以，如果需要缓存能够支持更复杂的结构和操作，那么Redis会是不错的选择。</div><div>4、安全机制<br />&nbsp; &nbsp; memcached采用cas机制，而redis有事务机制。<br />5、事件模型<br />&nbsp; &nbsp; memcached采用了libevent事件模型，多线程模型可以发挥多核作用，Redis实现了自己的一套和libevent类似的事件驱动机制，两者都采用了epoll通信模型和非阻塞机制。<p>&nbsp; &nbsp; epoll是在2.6内核中提出的，是之前的select和poll的增强版本。相对于select和poll来说，epoll更加灵活，没有描述符限制。epoll使用一个文件描述符管理多个描述符，将用户关系的文件描述符的事件存放到内核的一个事件表中，这样在用户空间和内核空间的copy只需一次。</p><div> <div>&nbsp;最后讲讲 <strong>为什么epoll会比select高效</strong>，主要从三方面来进行论述。 </div> <div>&nbsp; &nbsp; &nbsp; &nbsp;  （1）elect对描述符状态的改变是通过轮询来进行查找的；而epoll是当描述符状态发生改变时主动进行通知内核，这就是所谓的Reactor事件处理机制。可以用&#8220;好莱坞原则&#8221;进行描述：不要打电话给我们，我们会打电话通知你。相比之下，select的机制就好比面试结束后不停给面试官打电话询问面试结果。效率孰高孰低，可见一&nbsp;斑。  </div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </div> <div>&nbsp; &nbsp; &nbsp; &nbsp;（2）select的文件描述符是使用链表进行组织的；而epoll是使用红黑树这一高效数据结构组织的。 </div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（3）select从内核到用户空间传递文件描述符上发送的信息是使用内存复制的方式进行的；而epoll是采用共享内存的方式。 &nbsp;<br />6、内存管理方面</div><div>　　Memcached使用预分配的内存池的方式，使用slab和大小不同的chunk来管理内存，Item根据大小选择合适的chunk存储，内存池的方式可以省去申请/释放内存的开销，并且能减小内存碎片产生，但这种方式也会带来一定程度上的空间浪费，并且在内存仍然有很大空间时，新的数据也可能会被剔除，原因可以参考Timyang的文章：http://timyang.net/data/Memcached-lru-evictions/</div><div>　　Redis使用现场申请内存的方式来存储数据，并且很少使用free-list等方式来优化内存分配，会在一定程度上存在内存碎片，Redis跟据存储命令参数，会把带过期时间的数据单独存放在一起，并把它们称为临时数据，非临时数据是永远不会被剔除的，即便物理内存不够，导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据)，这点上Redis更适合作为存储而不是cache。<br />7、redis并发<br /><p><strong>Redis</strong> 是一个高性能的key-value数据库。 redis的出现，很大程度补偿了<a href="http://www.oschina.net/p/memcached">memcached</a>这类keyvalue存储的不足，在部  分场合可以对关系数据库起到很好的补充作用。它提供了Python，Ruby，Erlang，PHP客户端，使用很方便。</p> <p>性能测试结果：</p> <p>SET操作每秒钟 110000 次，GET操作每秒钟 81000 次，服务器配置如下：</p> <p><strong>Linux 2.6</strong>, <strong>Xeon X3320 2.5Ghz</strong>.</p> <p>stackoverflow 网站使用 Redis 做为缓存服务器。</p><br /><br /><br /><br /></div></div></div></div></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/424127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-04-05 05:45 <a href="http://www.blogjava.net/stevenjohn/archive/2015/04/05/424127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring redis整合(一)</title><link>http://www.blogjava.net/stevenjohn/archive/2012/11/14/391344.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 14 Nov 2012 15:17:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/11/14/391344.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/391344.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/11/14/391344.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/391344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/391344.html</trackback:ping><description><![CDATA[spring-data-redis下载地址：<br /><div>http://www.springsource.org/download/community?project=Spring%2520Data%2520Redis&amp;version=1.0.1.RELEASE<br /><br /><br />//spring-redis.xml<br /><div>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</div><div>&lt;beans xmlns="http://www.springframework.org/schema/beans"</div><div><span style="white-space:pre">	</span>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"</div><div><span style="white-space:pre">	</span>xmlns:cache="http://www.springframework.org/schema/cache"</div><div><span style="white-space:pre">	</span>xmlns:context="http://www.springframework.org/schema/context"</div><div><span style="white-space:pre">	</span>xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:oxm="http://www.springframework.org/schema/oxm"</div><div><span style="white-space:pre">	</span>xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util"</div><div><span style="white-space:pre">	</span>xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd &nbsp;</div><div><span style="white-space:pre">	</span>http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd &nbsp;</div><div>&nbsp; &nbsp; http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd &nbsp;</div><div>&nbsp; &nbsp;<span style="white-space:pre">	</span>http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd</div><div>&nbsp; &nbsp;<span style="white-space:pre">	</span>http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"&gt;</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span>&lt;context:annotation-config /&gt;</div><div><span style="white-space:pre">	</span>&lt;context:component-scan base-package="com.abin.lee.spring.redis"&gt;&lt;/context:component-scan&gt;</div><div><span style="white-space:pre">	</span>&lt;context:property-placeholder location="classpath:com/abin/lee/spring/redis/redis.properties" /&gt;</div><div><span style="white-space:pre">	</span>&lt;!-- 对象池配置： --&gt;</div><div><span style="white-space:pre">	</span>&lt;bean</div><div><span style="white-space:pre">		</span>id="jedisPoolConfig"</div><div><span style="white-space:pre">		</span>class="redis.clients.jedis.JedisPoolConfig"&gt;</div><div><span style="white-space:pre">		</span>&lt;property</div><div><span style="white-space:pre">			</span>name="maxActive"</div><div><span style="white-space:pre">			</span>value="${redis.pool.maxActive}" /&gt;</div><div><span style="white-space:pre">		</span>&lt;property</div><div><span style="white-space:pre">			</span>name="maxIdle"</div><div><span style="white-space:pre">			</span>value="${redis.pool.maxIdle}" /&gt;</div><div><span style="white-space:pre">		</span>&lt;property</div><div><span style="white-space:pre">			</span>name="maxWait"</div><div><span style="white-space:pre">			</span>value="${redis.pool.maxWait}" /&gt;</div><div><span style="white-space:pre">		</span>&lt;property</div><div><span style="white-space:pre">			</span>name="testOnBorrow"</div><div><span style="white-space:pre">			</span>value="${redis.pool.testOnBorrow}" /&gt;</div><div><span style="white-space:pre">	</span>&lt;/bean&gt;</div><div><span style="white-space:pre">	</span>&lt;!-- 工厂实现： --&gt;</div><div><span style="white-space:pre">	</span>&lt;bean</div><div><span style="white-space:pre">		</span>id="jedisConnectionFactory"</div><div><span style="white-space:pre">		</span>class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"&gt;</div><div><span style="white-space:pre">		</span>&lt;property</div><div><span style="white-space:pre">			</span>name="hostName"</div><div><span style="white-space:pre">			</span>value="${redis.ip}" /&gt;</div><div><span style="white-space:pre">		</span>&lt;property</div><div><span style="white-space:pre">			</span>name="port"</div><div><span style="white-space:pre">			</span>value="${redis.port}" /&gt;</div><div><span style="white-space:pre">		</span>&lt;property</div><div><span style="white-space:pre">			</span>name="poolConfig"</div><div><span style="white-space:pre">			</span>ref="jedisPoolConfig" /&gt;</div><div><span style="white-space:pre">	</span>&lt;/bean&gt;</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span>&lt;!--模板类： --&gt;</div><div><span style="white-space:pre">	</span>&lt;bean</div><div><span style="white-space:pre">		</span>class="org.springframework.data.redis.core.RedisTemplate"</div><div><span style="white-space:pre">		</span>p:connection-factory-ref="jedisConnectionFactory" /&gt;</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span></div><div></div><div>&lt;/beans&gt;</div><br /><br /><br /><br /><br /><br />//User.java<br /><div>package com.abin.lee.spring.redis.pojo;</div><div></div><div>import java.io.Serializable;</div><div></div><div>public class User implements Serializable {</div><div></div><div><span style="white-space:pre">	</span>/**</div><div><span style="white-space:pre">	</span> *&nbsp;</div><div><span style="white-space:pre">	</span> */</div><div><span style="white-space:pre">	</span>private static final long serialVersionUID = 2668307865623183776L;</div><div><span style="white-space:pre">	</span>private String uid;</div><div><span style="white-space:pre">	</span>private String address;</div><div><span style="white-space:pre">	</span>public User() {</div><div><span style="white-space:pre">		</span>super();</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span>public User(String uid, String address) {</div><div><span style="white-space:pre">		</span>super();</div><div><span style="white-space:pre">		</span>this.uid = uid;</div><div><span style="white-space:pre">		</span>this.address = address;</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span>public String getUid() {</div><div><span style="white-space:pre">		</span>return uid;</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span>public void setUid(String uid) {</div><div><span style="white-space:pre">		</span>this.uid = uid;</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span>public String getAddress() {</div><div><span style="white-space:pre">		</span>return address;</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span>public void setAddress(String address) {</div><div><span style="white-space:pre">		</span>this.address = address;</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>public String toString() {</div><div><span style="white-space:pre">		</span>return "User [uid=" + uid + ", address=" + address + "]";</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>public int hashCode() {</div><div><span style="white-space:pre">		</span>final int prime = 31;</div><div><span style="white-space:pre">		</span>int result = 1;</div><div><span style="white-space:pre">		</span>result = prime * result + ((address == null) ? 0 : address.hashCode());</div><div><span style="white-space:pre">		</span>result = prime * result + ((uid == null) ? 0 : uid.hashCode());</div><div><span style="white-space:pre">		</span>return result;</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>public boolean equals(Object obj) {</div><div><span style="white-space:pre">		</span>if (this == obj)</div><div><span style="white-space:pre">			</span>return true;</div><div><span style="white-space:pre">		</span>if (obj == null)</div><div><span style="white-space:pre">			</span>return false;</div><div><span style="white-space:pre">		</span>if (getClass() != obj.getClass())</div><div><span style="white-space:pre">			</span>return false;</div><div><span style="white-space:pre">		</span>User other = (User) obj;</div><div><span style="white-space:pre">		</span>if (address == null) {</div><div><span style="white-space:pre">			</span>if (other.address != null)</div><div><span style="white-space:pre">				</span>return false;</div><div><span style="white-space:pre">		</span>} else if (!address.equals(other.address))</div><div><span style="white-space:pre">			</span>return false;</div><div><span style="white-space:pre">		</span>if (uid == null) {</div><div><span style="white-space:pre">			</span>if (other.uid != null)</div><div><span style="white-space:pre">				</span>return false;</div><div><span style="white-space:pre">		</span>} else if (!uid.equals(other.uid))</div><div><span style="white-space:pre">			</span>return false;</div><div><span style="white-space:pre">		</span>return true;</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span></div><div>}</div><br /><br /><br /><br /><br /><br />//UserDao.java<br /><div><div>package com.abin.lee.spring.redis.dao;</div><div></div><div>import com.abin.lee.spring.redis.pojo.User;</div><div></div><div>public interface UserDao {</div><div><span style="white-space:pre">	</span>/**</div><div><span style="white-space:pre">	</span> * @param uid</div><div><span style="white-space:pre">	</span> * @param address</div><div><span style="white-space:pre">	</span> */</div><div><span style="white-space:pre">	</span>void save(User user);</div><div></div><div><span style="white-space:pre">	</span>/**</div><div><span style="white-space:pre">	</span> * @param uid</div><div><span style="white-space:pre">	</span> * @return</div><div><span style="white-space:pre">	</span> */</div><div><span style="white-space:pre">	</span>User read(String uid);</div><div></div><div><span style="white-space:pre">	</span>/**</div><div><span style="white-space:pre">	</span> * @param uid</div><div><span style="white-space:pre">	</span> */</div><div><span style="white-space:pre">	</span>void delete(String uid);</div><div>}</div><div></div></div><br /><br /><br /><br /><br />//UserDaoImpl.java<br /><div>package com.abin.lee.spring.redis.dao.impl;</div><div></div><div>import java.io.Serializable;</div><div></div><div>import org.springframework.beans.factory.annotation.Autowired;</div><div>import org.springframework.dao.DataAccessException;</div><div>import org.springframework.data.redis.connection.RedisConnection;</div><div>import org.springframework.data.redis.core.RedisCallback;</div><div>import org.springframework.data.redis.core.RedisTemplate;</div><div>import org.springframework.stereotype.Repository;</div><div></div><div>import com.abin.lee.spring.redis.dao.UserDao;</div><div>import com.abin.lee.spring.redis.pojo.User;</div><div>@Repository("userDao")</div><div>public class UserDaoImpl implements UserDao{</div><div><span style="white-space:pre">	</span>@Autowired</div><div><span style="white-space:pre">	</span>private RedisTemplate&lt;Serializable, Serializable&gt; redisTemplate;</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>public void save(final User user) {</div><div><span style="white-space:pre">		</span>redisTemplate.execute(new RedisCallback&lt;Object&gt;() {</div><div><span style="white-space:pre">			</span>@Override</div><div><span style="white-space:pre">			</span>public Object doInRedis(RedisConnection connection)</div><div><span style="white-space:pre">					</span>throws DataAccessException {</div><div><span style="white-space:pre">				</span>connection.set(</div><div><span style="white-space:pre">						</span>redisTemplate.getStringSerializer().serialize(</div><div><span style="white-space:pre">								</span>"user.uid." + user.getUid()),</div><div><span style="white-space:pre">						</span>redisTemplate.getStringSerializer().serialize(</div><div><span style="white-space:pre">								</span>user.getAddress()));</div><div><span style="white-space:pre">				</span>return null;</div><div><span style="white-space:pre">			</span>}</div><div><span style="white-space:pre">		</span>});</div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>public User read(final String uid) {</div><div><span style="white-space:pre">		</span>return redisTemplate.execute(new RedisCallback&lt;User&gt;() {</div><div><span style="white-space:pre">			</span>@Override</div><div><span style="white-space:pre">			</span>public User doInRedis(RedisConnection connection)</div><div><span style="white-space:pre">					</span>throws DataAccessException {</div><div><span style="white-space:pre">				</span>byte[] key = redisTemplate.getStringSerializer().serialize(</div><div><span style="white-space:pre">						</span>"user.uid." + uid);</div><div><span style="white-space:pre">				</span>if (connection.exists(key)) {</div><div><span style="white-space:pre">					</span>byte[] value = connection.get(key);</div><div><span style="white-space:pre">					</span>String address = redisTemplate.getStringSerializer()</div><div><span style="white-space:pre">							</span>.deserialize(value);</div><div><span style="white-space:pre">					</span>User user = new User();</div><div><span style="white-space:pre">					</span>user.setAddress(address);</div><div><span style="white-space:pre">					</span>user.setUid(uid);</div><div><span style="white-space:pre">					</span>return user;</div><div><span style="white-space:pre">				</span>}</div><div><span style="white-space:pre">				</span>return null;</div><div><span style="white-space:pre">			</span>}</div><div><span style="white-space:pre">		</span>});</div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>public void delete(final String uid) {</div><div><span style="white-space:pre">		</span>redisTemplate.execute(new RedisCallback&lt;Object&gt;() {</div><div><span style="white-space:pre">			</span>public Object doInRedis(RedisConnection connection) {</div><div><span style="white-space:pre">				</span>connection.del(redisTemplate.getStringSerializer().serialize(</div><div><span style="white-space:pre">						</span>"user.uid." + uid));</div><div><span style="white-space:pre">				</span>return null;</div><div><span style="white-space:pre">			</span>}</div><div><span style="white-space:pre">		</span>});</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span></div><div>}</div><div></div><br /><br />//UserDaoTest.java<br /><div>package com.abin.lee.spring.redis.dao.test;</div><div></div><div>import static org.junit.Assert.assertEquals;</div><div>import static org.junit.Assert.assertNull;</div><div></div><div>import org.junit.Before;</div><div>import org.junit.Test;</div><div>import org.springframework.context.ApplicationContext;</div><div>import org.springframework.context.support.ClassPathXmlApplicationContext;</div><div></div><div>import com.abin.lee.spring.redis.dao.UserDao;</div><div>import com.abin.lee.spring.redis.pojo.User;</div><div></div><div>public class UserDaoTest {</div><div><span style="white-space:pre">	</span>private ApplicationContext app;</div><div><span style="white-space:pre">	</span>private UserDao userDao;</div><div></div><div><span style="white-space:pre">	</span>@Before</div><div><span style="white-space:pre">	</span>public void before() throws Exception {</div><div><span style="white-space:pre">		</span>app = new ClassPathXmlApplicationContext("com/abin/lee/spring/redis/spring-redis.xml");</div><div><span style="white-space:pre">		</span>userDao = (UserDao) app.getBean("userDao");</div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>@Test</div><div><span style="white-space:pre">	</span>public void crud() {</div><div><span style="white-space:pre">		</span>// -------------- Create ---------------</div><div><span style="white-space:pre">		</span>String uid = "u123456";</div><div><span style="white-space:pre">		</span>String address1 = "上海";</div><div><span style="white-space:pre">		</span>User user = new User();</div><div><span style="white-space:pre">		</span>user.setAddress(address1);</div><div><span style="white-space:pre">		</span>user.setUid(uid);</div><div><span style="white-space:pre">		</span>userDao.save(user);</div><div></div><div><span style="white-space:pre">		</span>// ---------------Read ---------------</div><div><span style="white-space:pre">		</span>user = userDao.read(uid);</div><div><span style="white-space:pre">		</span>System.out.println("address1="+user.getAddress());</div><div><span style="white-space:pre">		</span>assertEquals(address1, user.getAddress());</div><div></div><div><span style="white-space:pre">		</span>// --------------Update ------------</div><div><span style="white-space:pre">		</span>String address2 = "北京";</div><div><span style="white-space:pre">		</span>user.setAddress(address2);</div><div><span style="white-space:pre">		</span>userDao.save(user);</div><div></div><div><span style="white-space:pre">		</span>user = userDao.read(uid);</div><div><span style="white-space:pre">		</span>System.out.println("address2Save="+user.getAddress());</div><div><span style="white-space:pre">		</span>assertEquals(address2, user.getAddress());</div><div></div><div><span style="white-space:pre">		</span>// --------------Delete ------------</div><div><span style="white-space:pre">		</span>userDao.delete(uid);</div><div><span style="white-space:pre">		</span>user = userDao.read(uid);</div><div><span style="white-space:pre">		</span>System.out.println("addressdel="+user.getAddress());</div><div><span style="white-space:pre">		</span>assertNull(user);</div><div><span style="white-space:pre">	</span>}</div><div>}</div><br /><br /><br /><br /><br /></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/391344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-11-14 23:17 <a href="http://www.blogjava.net/stevenjohn/archive/2012/11/14/391344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Redis在windows下的安装使用  </title><link>http://www.blogjava.net/stevenjohn/archive/2012/11/12/391227.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 12 Nov 2012 12:45:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/11/12/391227.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/391227.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/11/12/391227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/391227.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/391227.html</trackback:ping><description><![CDATA[<p>下载的windows版本是redis-2.0.2，解压到D盘下：</p> <p>D:\redis-2.0.2</p> <p><br />进到该目录下，有下列文件：</p> <p><img alt="" src="http://pic002.cnblogs.com/images/2011/282432/2011110919355050.jpg" /></p> <p><strong>　redis-server.exe</strong>：服务程序</p> <div> <p>&nbsp;&nbsp; <strong>redis-check-dump.exe</strong>：本地数据库检查</p> <p><strong>&nbsp;&nbsp;  redis-check-aof.exe</strong>：更新日志检查</p></div> <div><strong>&nbsp;&nbsp;  redis-benchmark.exe</strong>：性能测试，用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于  Apache 的ab 工具).</div> <div><br /></div> <p><span style="color: #ff0000">启动Redis服务</span>（conf文件指定配置文件，若不指定则默认）：</p> <p>D:\redis-2.0.2&gt;<span style="color: #ff0000">redis-server.exe</span>  redis.conf<br /><br /></p> <p><img alt="" src="http://pic002.cnblogs.com/images/2011/282432/2011110920095415.jpg" /></p> <p><br /><br /><span style="color: #ff0000">启动cmd窗口要一直开着，关闭后则Redis服务关闭</span>。</p> <p>这时服务开启着，另外开一个窗口进行，设置客户端：</p> <p>D:\redis-2.0.2&gt;<span style="color: #ff0000">redis-cli.exe</span> -h <span style="color: #ff0000">202.117.16.133</span> -p 6379</p> <p>然后可以开始玩了：</p> <p><img alt="" src="http://pic002.cnblogs.com/images/2011/282432/2011110920151780.jpg" /></p> <p><br /><br />--------------------------------------------------------------------------------------------------------------------------------</p> <p>&nbsp;</p> <p>Redis提供了多种语言的客户端，包括Java，C++，python。</p> <p>&nbsp;</p> <p>Redis官网上推荐的Java包是Jedis，去下载Jedis，在Java项目中导入Jedis包，开始发现有错误，是因为缺少org.apache.commons这个包，</p> <p>去网上找此包，下载导入后，Jedis就没有错误了。</p> <p><br />可以开始了，用Jedis来操作Redis：<br /><br /><div>package test;</div><div></div><div>import redis.clients.jedis.Jedis;</div><div></div><div>public class Client {</div><div></div><div>&nbsp; &nbsp; /**</div><div>&nbsp; &nbsp; &nbsp;* @param args</div><div>&nbsp; &nbsp; &nbsp;*/</div><div>&nbsp; &nbsp; public static void main(String[] args) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; // TODO Auto-generated method stub</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Jedis jj = new &nbsp;Jedis("localhost");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; jj.set("key1", "I am value 1");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; String ss = jj.get("key1");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(ss);</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp;&nbsp;</div><div>}</div></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/391227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-11-12 20:45 <a href="http://www.blogjava.net/stevenjohn/archive/2012/11/12/391227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows下redis安装(一)</title><link>http://www.blogjava.net/stevenjohn/archive/2012/11/12/391226.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 12 Nov 2012 12:44:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/11/12/391226.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/391226.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/11/12/391226.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/391226.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/391226.html</trackback:ping><description><![CDATA[<h1><p>首先下载一个redis的安装包:</p> <p>windows:<a href="http://code.google.com/p/servicestack/wiki/RedisWindowsDownload">http://code.google.com/p/servicestack/wiki/RedisWindowsDownload</a></p> <p>linux:<a href="http://code.google.com/p/redis/downloads/list">http://code.google.com/p/redis/downloads/list</a></p> <p>redis-2.0.0版本: <a title=" 已下载 302 次" href="http://blog.phpwind.me/wp-content/plugins/download-monitor/download.php?id=7">redis-2.0.0  (302)</a></p> <p>redis-2.4.5版本:&nbsp;<a title=" 已下载 506 次" href="http://blog.phpwind.me/wp-content/plugins/download-monitor/download.php?id=22">redis-2.4.5-win32-win64.zip  (506)<br /><p>解压后,得到一个redis的文件夹,打开文件夹得到如下图的一些文件:</p> <p><a href="http://blog.phpwind.me/wp-content/uploads/2012/04/11.png" rel="fancybox" jquery172022244671376573877="1"><img size-full=""  wp-image-153"="" title="1" alt="" src="http://blog.phpwind.me/wp-content/uploads/2012/04/11.png" width="586" height="172" /></a></p> <p>安装包中是不提供redis.conf的,关于配置可以到网上搜索一下,或者从这里直接下载:<a title=" 已下载 643 次" href="http://blog.phpwind.me/wp-content/plugins/download-monitor/download.php?id=8">redis.conf  (643)</a></p> <p>下载后可以将redis.conf放到上图所示位置!</p> <p>用命令行,切换到redis的根目录,然后启动redis服务端即redis-server.exe,如下图:</p><p>&nbsp;</p> <p><a href="http://blog.phpwind.me/wp-content/uploads/2012/04/21.png" rel="fancybox" jquery172022244671376573877="2"><img size-full=""  wp-image-154"="" title="2" alt="" src="http://blog.phpwind.me/wp-content/uploads/2012/04/21.png" width="631" height="228" /></a></p> <p>启动后的效果图如下:</p> <p><a href="http://blog.phpwind.me/wp-content/uploads/2012/04/31.png" rel="fancybox" jquery172022244671376573877="3"><img size-full=""  wp-image-155"="" title="3" alt="" src="http://blog.phpwind.me/wp-content/uploads/2012/04/31.png" width="704" height="224" /></a></p> <p>当前服务端没有1个客户端连接,因此显示0 clients,</p> <p>现在分别启动两个客户端,如下图:</p> <p><a href="http://blog.phpwind.me/wp-content/uploads/2012/04/41.png" rel="fancybox" jquery172022244671376573877="4"><img size-full=""  wp-image-156"="" title="4" alt="" src="http://blog.phpwind.me/wp-content/uploads/2012/04/41.png" width="1076" height="379" /></a><a href="http://blog.phpwind.me/wp-content/uploads/2012/04/51.png" rel="fancybox" jquery172022244671376573877="5"><img size-full=""  wp-image-157"="" title="5" alt="" src="http://blog.phpwind.me/wp-content/uploads/2012/04/51.png" width="1113" height="475" /></a></p> <p>这里值得注意的是:当你登录redis-cli.exe的时候,服务端并没有检测到客户端的存在,也就是在客户端执行了第一次操作以后,服务端才检测到这个状态.</p><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></a></p></h1><img src ="http://www.blogjava.net/stevenjohn/aggbug/391226.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-11-12 20:44 <a href="http://www.blogjava.net/stevenjohn/archive/2012/11/12/391226.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>