一种关于Redis使用的方法

文档序号:9911282阅读:493来源:国知局
一种关于Redis使用的方法
【技术领域】
[0001]本发明涉及一种数据库使用方法技术领域,具体地说是一种关于Redis使用的方法。
【背景技术】
[0002]Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set —有序集合)和hash(哈希类型)。这些数据类型都支持pUSh/p0p、add/rem0Ve及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与memcached—样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
[0003]Redis是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了支持Java的客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
[0004]如何在服务器上更好的使用Redis是目前需要解决的问题。

【发明内容】

[0005]本发明的技术任务是针对以上不足之处,提供一种关于Redis使用的方法,来解决如何在服务器上更好的使用Redis的问题。
[0006]本发明解决其技术问题所采用的技术方案是:
一种关于Redis使用的方法,包括如下步骤:
(1)、配置硬件环境,采用装有Linux操作系统或者Windows操作系统的服务器;
(2)、服务器上安装Redis;
(3)、安装成功后,启动Redis,再创建Java客户端;
(4)、在eclipse中新建一个java项目,然后添加javaredis包引用;
(5)、Redis保存排序结果,默认情况下,SORT操作只是简单地返回排序结果,若需要保存排序结果,可以给STORE选项指定一个key;作为参数,排序结果将以列表的形式被保存到这个key上;结果保存用EXPIRE为结果集设置生存时间,结果集为SORT操作的一个缓存;
(6)、自增一个key,得到一个自增ID,然后通过此ID创建对象,为对象的每个字段设置一个key,最后将新对象的ID压入submitted.news list;
(7)、对每个想加标签的对象,用一个标签ID集合与之关联,并且对每个已有的标签,一组对象ID与之关联;
(8)、Redis集合和list都是可排序的;
(9)、Redis具有发布订阅功能,一个publish客户端的Redisclient发布消息,其他多个subscribe客户端的redis client订阅消息。
[0007]Redis支持以下五种数据类型:字符串(strings)、字符串列表(lists)、字符串集合(sets)、有序字符串集合(sorted sets)、哈希(hashes)。
[0008]步骤(9)中,使用JMS或者基于Redis中做如下方式使得订阅消息持久:
①、Subscribe客户端首先向一个Set集合中增加订阅者ID,此Set集合保存了活跃的订阅者ID,订阅者ID标记每个唯一的订阅者,例如:sub: email, sub:web;此Set集合称为活跃订阅者集合;
②、subcribe客户端开启订阅操作,并基于Redis创建一个以订阅者ID为KEY的LIST数据结构,此LIST中存储了所有的尚未消费的消息;此LIST称为订阅者消息队列;
③、publish客户端,每发布一条消息之后,publish客户端遍历活跃订阅者集合,并依次向每个订阅者消息队列尾部追加此次发布的消息;
④、发布的每一条消息,能偶持久保存在每个订阅者消息队列中;
⑤、subscribe客户端,每收到一个订阅消息,在消费之后,删除自己的订阅者消息队列头部的一条记录;
⑥、subscribe客户端启动时,若发现自己的订阅者消息队列有残存记录,那么将会首先消费这些记录,然后再去订阅。
[0009]本发明的一种关于Redis使用的方法和现有技术相比,具有以下有益效果:
1、能够在服务器上更好的使用Redis;
2、Redis具有发布订阅功能,使用JMS或者基于Redi s中通过本发明使得订阅消息持久。
【具体实施方式】
[0010]下面结合具体实施例对本发明作进一步说明。
[0011]本发明的一种关于Redis使用的方法,包括如下步骤:
(1)、配置硬件环境,采用装有Linux操作系统或者Windows操作系统的服务器;
(2)、服务器上安装Redis;
(3)、安装成功后,启动Redis,再创建Java客户端;
(4)、在eelipse中新建一个java项目,然后添加jredis包引用;代码如下:
import org.jredis.*; import org.jredis.r1.alphazer0.JRedisClient; publicclass App { public static void main(String[] args) { try {JRedis
jr = new JRedisClient(^l27.0.0.1^,6379); //redis服务地址和端口号String
key = 〃mKey〃;jr.set (key, ,,hello,redis !〃);String v
=new String(jr.get(key));String k2 = 〃count〃;jr.1ncr
(k2);jr.1ncr(k2);System.0ut.println(v); System.0ut.printIn
(new String(jr.get(k2)));} catch (Except1n e) { // T0D0: handleexcept1n} } }0
[0012]Redis支持以下五种数据类型:字符串(strings)、字符串列表(lists)、字符串集合(sets)、有序字符串集合(sorted sets)、哈希(hashes)。
[0013]关于key,注意以下几点:(l)、key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;(2)、key也不要太短,太短的话,key的可读性会降低;(3)、在一个项目中,key最好使用统一的命名模式,例如user: 10000:passwcL
[0014]下面是一个java代码的Demo D
[0015]import java.util.Date;import java.util.HashMap;import java.util.1terator;import java.util.List;import java.util.Map;import java.util.Set;import org.junit.Test;
import redis.clients.jedis.Jedis;import redis.clients.jedis.Pipeline;import redis.clients.jedis.SortingParams;import com.wujinta0.redis.util.RedisUtil;public class TestCase {......0
[0016]不同的线程中使用相同的Jedis实例会发生奇怪的错误。但是创建太多的实现也不好因为这意味着会建立很多sokcet连接。也会导致奇怪的错误发生。单一Jedis实例不是线程安全的。为了避免这些问题,可以使用JedisPool,JedisPool是一个线程安全的网络连接池。可以用JedisPool创建一些可靠Jedis实例,可以从池中拿到Jedis的实例。这种方式可以解决那些问题并且会实现高效的性能。
[0017](5)、Redis保存排序结果,默认情况下,SORT操作只是简单地返回排序结果,若需要保存排序结果,可以给STORE选项指定一个key;作为参数,排序结果将以列表的形式被保存到这个key上;结果保存用EXPIRE为结果集设置生存时间,结果集为SORT操作的一个缓存;操作时,只有当结果集过期时,才需要再调用一次SORT操作;有时候为了正确实现这一用法,需要加锁以避免多个客户端同时进行缓存重建(也就是多个客户端,同一时间进行SORT操作,并保存为结果集),具体参见SETNX命令;
(6)、自增一个key,得到一个自增ID,然后通过此ID创建对象,为对象的每个字段设置一个key,最后将新对象的ID压入submitted.news list;
在命令参考文档中可以读到所有和list有关的命令,可以删除元素,旋转list,根据索引获取和设置元素,也可以用LLEN得到list的长度,部分代码如下:public void testListStrUsage() {
String title = 〃太阳能是绿色能源4〃 ;
String url = "http://javacreazyer.1teye.com";
Jedis jedis = RedisUtil.getjedis();
long adlnfold = jedis.1ncr(〃ad:adinfo:next.1d〃);jedis.set(〃ad:adinfo:〃 + adlnfold + 〃:title〃,title);jedis.set(〃ad:adinfo:〃 + adlnfold + 〃:url〃, url);jedis.1push("ad:adinfo",String.valueOf(adlnfold));
String resultTitle = jedis.get(〃ad:adinfo:〃 + adlnfold + 〃:
title,,);
String resultUrl = jedis.get(〃ad:adinfo:〃 + adlnfold + 〃:url〃);List〈String> ids = jedis.lrange(〃ad:adinfo〃, 0, -1);
System.0ut.printIn(resultTitle);
System.0ut.printIn(resultUrl);
System.0ut.println(ids);
/#
* dbsize返回的是所有key的数目,包括已经过期的,而redis_cli keys〃*〃查询得到的是有效的key数目
V
System.0ut.print In (jedis.dbSizeO); jedis.flushAllO ;
} O
[0018](7)、对每个想加标签的对象,用一个标签ID集合与之关联,并且对每个已有的标签,一组对象ID与之关联;
例如假设我们的新闻ID:
*1000被加了三个标签tag I,2,5和77,就可以设置下面两个集合:$ redis-cli sadd news:1000:tags I
木(integer) I $ redis-cli sadd news:1000:tags 2 (integer) I $ redis-cli
*sadd news:1000:tags 5 (integer) I $ redis-cli sadd news:1000:tags 77 木(integer) I $ redis-cli sadd tag:1: objects 1000 (integer) I $
redis-cli
*sadd tag:2!objects 1000 (integer) I $ redis-cli sadd tag:5!objects 1000木(integer) I $ redis-cli sadd tag:77:objects 1000 (integer) I ;
要获取一个对象的所有标签,如此简单:$ redis-cli smembers news: 1000:tags 1.5 2.1 3.77 4;而有些看上去并不简单的操作仍然能使用相应的Redis命令轻松实现;例如我们也许想获得一份同时拥有标签I,2,10和27的对象列表;这可以用SINTER命令来做,他可以在不同集合之间取出交集。因此为达目的我们只需:$ redis-cli sinter
木 tag:1:objects tag:2:objects tag:10:objects tag:27!objects...no
result
氺 in our dataset composed of just one object...;
(8)、Redis集合和list都是可排序的;部分代码如下:public void testSetUsage() {
Jedis jedis = RedisUtil.getjedis();
jedis.sadd(,,zhongsou:news: 1000: tags,,,〃1〃);jedis.sadd(,,zhongsou:news: 1000: tags,,,〃2〃);jedis.sadd(,,zhongsou:news: 1000: tags,,,〃5〃);jedis.sadd(,,zhongsou:news: 1000: tags,,,〃77〃);jedis.sadd(,,zhongsou:news: 2000: tags,,,〃1〃);jedis.sadd(,,zhongsou:news: 2000: tags,,,〃2〃);jedis.sadd (,,zhongsou: news: 2000: tags,,,〃5〃);jedis.sadd (,,zhongsou
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1