应用程序处理的数据越来越多,对并发访问的要求越来越大,程序的性能却并没有提升。发布日期越近,我们的心情就越想热锅上的蚂蚁,那叫一个急啊!不停的做性能剖析,做性能调优,却百思不得其解。幸好,我们及时遇到了Redis,让性能瞬间提升了百倍,真的有一种山穷水尽疑无路,柳暗花明又一村的感觉!今天我们就简单介绍一下Redis的一些用法,给大家的性能调优提供一种新的思路。
Redis简介
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API, 包括Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等
Redis 是一个高性能的key-value数据库,它支持存储的value类型包括string (字符串)、list(链表)、set(集合)、zset(sorted set--有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。
为了保证效率,数据都是缓存在内存中,并且周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis在一些应用场合可以对关系数据库起到很好的补充作用。在某些场合,可以认为Redis是一个内存数据库,通过内存缓存功能来达到性能的极大提升。
1. 环境搭建
Redis可以通过两种方式安装
- 通过源代码安装
- 从redis.io下载最新版redis-X.Y.Z.tar.gz后解压,然后进入redis-X.Y.Z文件夹后直接make即可
- 通过安装包管理工具安装
- 以ubuntu为例 :#sudo apt-get install redis-server
- 这种方式安装的redis server不是最新版本,但是满足基本使用是没有问题的
2. 常用配置
Redis提供了丰富的配置,缺省配置文件是安装根目录下的redis.conf。通常情况下大部分配置项只需要保持缺省值就能满足大多数应用场景,下面是一些常用的配置项。
- 是否以daemon形式来运行
daemonize no
缺省为no
- 响应请求的IP
bind 192.168.1.100 10.0.0.1
缺省会响应本机所有可用网卡的连接请求,如果要响应所有机器的连接,需要修改为bind 0.0.0.0
- 端口号
port 6379
- 日志等级
共分四级,即debug、verbose、notice、warning, 其中warning的级别最高
loglevel notice
- logfile设置日志文件的生成位置
logfile
如果为空,则日志会输出到标准输出
- 数据库的总数量
databases 16
这16个数据库的编号将是0到15。默认的数据库是编号为0的数据库。用户可以使用select <DBid>来选择相应的数据库
- 数据保存到磁盘上,即控制RDB快照功能
save 900 1 //表示每15分钟且至少有1个key改变,就触发一次持久化
save 300 10 //表示每5分钟且至少有10个key改变,就触发一次持久化
save 60 10000 //表示每60秒至少有10000个key改变,就触发一次持久化
禁用RDB持久化的策略,只要不设置任何save指令就可以,或者给save传入一个空字符串参数也可以达到相同效果
- 设置Redis主从同步
slaveof <masterip> <masterport>
- AOF持久化
appendonly no
redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了
3. 常用命令
- 客户端连接
#src/redis-cli
- 停止redis服务:
src/redis-cli> shutdown
- 取出当前匹配的所有key
> keys *
- 设置key的值
> set keyname keyvalue
- 获取key的值
> get keyname
- 当前的key是否存在, 0表示不存在
> exists larry
(integer) 0
- 删除指定的key
> del lv
- 设置过期时间
> expire larry 10
(integer) 1
- 移动larry键值对到ad4数据库
> move larry ad4
(integer) 1
- 移除当前key的过期时间
> persist lv
(integer) 1
- 随机返回一个key
> randomkey
- 重命名key
> rename
- 测试连接是否还在
> ping
PONG
- 打印
> echo name
"larry"
- 数据库切换
> select ad4databank
OK
- 退出连接
> quit
- 当前数据库中key的数量
> dbsize
(integer) 12
- 服务器基本信息
> info
- 获取服务器的参数配置
> config get
- 清空当前数据库
> flushdb
- 清除所有数据库
> flushall
4. 应用程序接口
因为Redis的数据操作非常简单,应用程序API接口用法也非常直观明了,有了相应的第三方库支持,连接上Redis Server之后,剩下的就是很简单的一些操作,上面第四节中命令支持的,应用程序API接口也基本上都支持。
- Java
引入Jedis这个第三方库之后,就可以用例子代码进行简单的数据插入和查询动作了
1 2 3 4 5 6 7 |
public static void main(String[] args) { Jedis jedis = new Jedis("147.151.240.234",6379); jedis.set("foo", "bar"); String value = jedis.get("foo"); System.out.println(value); } |
当然也有好事者对Jedis进行了进一步封装,使得该API更方便灵活,很有名的例子就是Jfinal中的RedisPlugin
Python
首先需要安装python的支持库,通过执行命令sudo apt-get install python-redis或者在Windows环境下执行pip install redis即可,接下来就是对数据的增删查操作了,非常直观
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
import redis r = redis.Redis(host='10.0.1.7', port=6379, db=1) # 查数据库大小 print '\ndbsize: %s' % r.dbsize() # 塞数据 r['c1'] = 'bar' #或者 r.set('c2','bar') # 取数据 print 'r['']:',r['c1'] #或者 print 'get:',r.get('a') #或者 同时取一批 print 'mget:',r.mget('c1','c2') #或者 同时取一批 它们的名字(key)很像 而恰好你又不想输全部 print 'keys:',r.keys('c*') #又或者 你只想随机取一个: print 'randomkey:',r.randomkey() # 查看一个数据有没有 有 1 无0 print 'existes:',r.exists('a') # 删数据 1是删除成功 0和None是没这个东西 print 'delete:',r.delete('cc') # 哦对了 它是支持批量操作的 print 'delete:',r.delete('c1','c2') |
5. 案例分析
在我们的项目中,Redis作为关系型数据库的一个内存缓存,当有用户查询时,先查看Redis中是否有用户需要的信息,有的话直接返回;没有需要的信息,再到关系型数据库中进行查询,同时查询的结果缓存到Redis中,加快后续查询的性能。总体而言,使用Redis之后,整个应用程序的性能提升了上百倍。

文章评论