1. Redis简介
a) Redis安装
随着互联网尤其是Web2.0技术的迅猛发展,每个网民都成为信息发布者和消费者。Web服务器中的数据存储量呈爆炸增长趋势,而单位时间内Web 服务器接收的访问请求也在逐步增加。这对后台数据库处理大规模数据和应对高并发访问的能力,提出越来越高的要求。传统的关系数据库由于其固有缺陷难以有效 支持新型Web应用。
NoSQL数据库作为一类新型非关系数据库,具有高性能、高效存储、高可用性和高可扩展性等诸多优势。它结构简单,读写效率高,支持服务器集群,能 够处理海量数据,可以应对高并发访问。NoSQL数据库打破了关系数据库的垄断局面,被广泛应用于各种大型Web应用。目前,NoSQL数据库有大量商业 实现,如:Google的BigTable,Amazon的Dynamo 等等。除此之外,NoSQL数据库也有一些开源实现,如:Redis,Memcached,HBase等等。
Redis是一种开源的基于Key-Value的轻量级NoSQL数据库。该项目使用BSD授权协议,由Salvatore Sanfilippo于2009年发起,最新的稳定版本为2.4.0。Redis用C语言编写而成,源代码仅4万行左右,编译后二进制文件不到1M,能够 方便地嵌入到各种应用环境。麻雀虽小,五脏俱全。Redis除支持基本的针对Key-Value的Get/Set操作外,还具备若干实用的新特性。
Redis 中的Value不仅能够存储String类型,还能存储List,Set,Sorted Set和Hash四种常见的数据结构,并提供针对这些数据结构的操作原语,这为开发人员提供了极大便利,能够有效减少网络数据传输量。Redis也被称为 “数据结构服务器”。
Redis支持Master/Slave集群。集群中有一台Master服务器,其下可以挂载若干Slave服务器,而Slave服务器下还可挂载 若干Slave服务器,每个Slave服务器都是Master服务器的镜像。读操作可以负载均衡到各个服务器上并行执行。写操作则先阻塞各Slave服务 器,然后在Master服务器上执行,最后把修改传播到各Slave服务器并解除阻塞。
Redis支持内存数据持久化。它能够把内存中存储的数据按照一定策略写入硬盘文件,并通过读取硬盘文件重建内存数据。这能够在一定程度上缓解服务 器崩溃导致的数据丢失问题。Redis支持Snapshotting和AOF两种持久化方法:前者能够导出完整镜像文件,相当于完全备份;后者则在日志文 件中记录每个写操作,相当于增量备份。
Redis实现了独立于操作系统的Virtual Memory管理系统,能优化系统运行效率。Redis还支持Pipelining批处理,能提高系统吞吐量。
Redis的诸多优点吸引了大批开发人员,它被广泛地应用于各种NoSQL数据库适用的场合,譬如程序员问答社区StackOverFlow就使用Redis作为缓存服务器。
下面将详细介绍Redis的安装和使用方法。
2. Redis安装配置
a) Redis安装
获取Redis
1,官网下载:http://www.redis.io/download
2,笔者使用的Redis下载:
Redis安装文件解压后,有以下几个文件。见下图
redis-server.exe:服务程序
redis-check-dump.exe:本地数据库检查
redis-check-aof.exe:更新日志检查
redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的ab 工具).
redis-check-dump.exe:本地数据库检查
redis-check-aof.exe:更新日志检查
redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的ab 工具).
在解压好redis的安装文件后,还需要在redis根目录增加一个redis的配置文件redis.conf
因内容范围及篇幅有限,此处不详细讲解redis.conf
此处不讲解命令行方式启动,直接双击redis-server.exe启动Redis服务程序
b)根据BizFoundation教程创建BizFoundation工程,在工程中加入jar包,在程序中嵌入Redis代码
jredis-1.0-rc2.jar下载处--->
关键代码如下:
复制代码
初始化客户端实例,构造函数包含两个参数,
关键代码如下:
- private static JRedis jredis = new JRedisClient("127.0.0.1", 6379);
一个"127.0.0.1",Redis服务器端IP,
一个6379,Redis服务器端口号
实例化客户端后,即可开始应用,此处的jredis实例类似于普通jdbc的connection,同时也具有类似于hashmap的功能
BizFoundation程序关键代码:
1,显示列表代码
复制代码
2,单击某一行显示详情
复制代码
3,更新
复制代码
4,删除
复制代码
示例工程代码:,可直接运行,查看code数据字典界面
其中文章中关键代码位于com.icss.codemanager.controller.CodeController.java类中
附注:Redis常用命令集
1,显示列表代码
- public void listCode(Page page,Code code) throws RedisException {
- page = codeService.findByPage(code, page);//此处将数据库中查出的数据以id为key,存于jredis中
- List<Code> list = page.getResult();
- for(int i =0;i<list.size();i++){
- Code codetmp = list.get(i);
- jredis.sadd(codetmp.getId().toString(),codetmp);
- }
- this.renderJSON(PageUtil.toJson4JqGrid(page, true));
- }
2,单击某一行显示详情
- public void show(Integer id) throws RedisException {
- if(null == id){
- throw new NullPointerException("主键为Null");
- }
- //Model code = codeService.findById(id);//此处将原来bizfoundation生成的从数据库中查询的代码注释掉,
- List<Code> list = DefaultCodec.decode(jredis.smembers(id.toString()));//直接从redis里通过key查询
- View view = new View(SUCCESS);
- Model code = list.get(0);
- view.bind("code",code);
- this.render(view);
- }
3,更新
- public void update(Code code) throws RedisException {
- codeService.update(code);
- jredis.sadd(code.getId().toString(),code);
- //同时更新数据库和redis
- this.renderJSON(code);
- }
- public void delete(String ids) throws RedisException {
- this.codeService.batchDelete(ids);
- jredis.del(ids);//redis和数据库同时删除
- }
其中文章中关键代码位于com.icss.codemanager.controller.CodeController.java类中
附注:Redis常用命令集
1)连接操作命令
1 quit:关闭连接(connection)
2 auth:简单密码认证
3 help cmd: 查看cmd帮助,例如:help quit
4
2)持久化
5 save:将数据同步保存到磁盘
6 bgsave:将数据异步保存到磁盘
7 lastsave:返回上次成功将数据保存到磁盘的Unix时戳
8 shundown:将数据同步保存到磁盘,然后关闭服务
3)远程服务控制
9 info:提供服务器的信息和统计
10 monitor:实时转储收到的请求
11 slaveof:改变复制策略设置
12 config:在运行时配置Redis服务器
4)对value操作的命令
13 exists(key):确认一个key是否存在
14 del(key):删除一个key
15 type(key):返回值的类型
16 keys(pattern):返回满足给定pattern的所有key
17 randomkey:随机返回key空间的一个
18 keyrename(oldname, newname):重命名key
19 dbsize:返回当前数据库中key的数目
20 expire:设定一个key的活动时间(s)
21 ttl:获得一个key的活动时间
22 select(index):按索引查询
23 move(key, dbindex):移动当前数据库中的key到dbindex数据库
24 flushdb:删除当前选择数据库中的所有key
25 flushall:删除所有数据库中的所有key
5)String
26 set(key, value):给数据库中名称为key的string赋予值value
27 get(key):返回数据库中名称为key的string的value
28 getset(key, value):给名称为key的string赋予上一次的value
29 mget(key1, key2,…, key N):返回库中多个string的value
30 setnx(key, value):添加string,名称为key,值为value
31 setex(key, time, value):向库中添加string,设定过期时间time
32 mset(key N, value N):批量设置多个string的值
33 msetnx(key N, value N):如果所有名称为key i的string都不存在
34 incr(key):名称为key的string增1操作
35 incrby(key, integer):名称为key的string增加integer
36 decr(key):名称为key的string减1操作
37 decrby(key, integer):名称为key的string减少integer
38 append(key, value):名称为key的string的值附加value
39 substr(key, start, end):返回名称为key的string的value的子串
6)List
40 rpush(key, value):在名称为key的list尾添加一个值为value的元素
41 lpush(key, value):在名称为key的list头添加一个值为value的 元素
42 llen(key):返回名称为key的list的长度
43 lrange(key, start, end):返回名称为key的list中start至end之间的元素
44 ltrim(key, start, end):截取名称为key的list
45 lindex(key, index):返回名称为key的list中index位置的元素
46 lset(key, index, value):给名称为key的list中index位置的元素赋值
47 lrem(key, count, value):删除count个key的list中值为value的元素
48 lpop(key):返回并删除名称为key的list中的首元素
49 rpop(key):返回并删除名称为key的list中的尾元素
50 blpop(key1, key2,… key N, timeout):lpop命令的block版本。
51 brpop(key1, key2,… key N, timeout):rpop的block版本。
52 rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
7)Set
53 sadd(key, member):向名称为key的set中添加元素member
54 srem(key, member) :删除名称为key的set中的元素member
55 spop(key) :随机返回并删除名称为key的set中一个元素
56 smove(srckey, dstkey, member) :移到集合元素
57 scard(key) :返回名称为key的set的基数
58 sismember(key, member) :member是否是名称为key的set的元素
59 sinter(key1, key2,…key N) :求交集
60 sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
61 sunion(key1, (keys)) :求并集
62 sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
63 sdiff(key1, (keys)) :求差集
64 sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
65 smembers(key) :返回名称为key的set的所有元素
66 srandmember(key) :随机返回名称为key的set的一个元素
8)Hash
67 hset(key, field, value):向名称为key的hash中添加元素field
68 hget(key, field):返回名称为key的hash中field对应的value
69 hmget(key, (fields)):返回名称为key的hash中field i对应的value
70 hmset(key, (fields)):向名称为key的hash中添加元素field
71 hincrby(key, field, integer):将名称为key的hash中field的value增加integer
72 hexists(key, field):名称为key的hash中是否存在键为field的域
73 hdel(key, field):删除名称为key的hash中键为field的域
74 hlen(key):返回名称为key的hash中元素个数
75 hkeys(key):返回名称为key的hash中所有键
76 hvals(key):返回名称为key的hash中所有键对应的value
77 hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value