Redis数据库基础与应用
PS:原创文章,如需转载,请注明出处,谢谢!
本文地址:http://flyer0126.iteye.com/blog/2250973
一、Redis简介
开源 key-value形式存储 数据结构服务器 与关系型不同之处:sql标准、acid属性、表结构
特点:非关系型、分布式的、开源的、水平扩展的
优势:数据高并发读写、海量数据高效率的存储和访问、对数据的高可扩展性和高可用性
支持数据类型:string、hashes、lists、sets、sorted sets
支持push\pop、add\remove 交\并集、各种不同的排序
保证效率 数据缓存在内存中,周期性将更新数据写入磁盘或将修改操作写入追加的记录文件[数据快照或记录操作]
二、应用场景
1. 应用架构
1.1. 应用程序(Application)直接访问Redis
1.2. 应用程序直接访问Redis,当Redis访问失败时才访问Mysql
2. 适用场合
2.1. 取最新N个数据的操作
2.2. 排行榜应用,取top N 的操作
2.3. 精确设定过期时间的应用
2.4. 计数器的应用
2.5. Uniq操作,获取某段时间所有数据排重值
2.6. 实时系统,反垃圾系统
2.7. Pub/Sub构建实时消息系统
2.8. 构建队列系统
2.9. 缓存
三、常用命令
1. 键值相关命令
expire 设置失效时间
select (0-15)选择数据库
persist key 取消过期时间
randomkey 随机返回key
rename 重命名key
type 返回key的数据类型
2. 服务器相关命令
ping 测试连接是否存活
info 获取服务器信息和统计
flushall 删除所有数据库中的所有key
完整命令目录:
四、高级应用
1. 安全性
设置客户端连接后进行任何其他指令前需要使用的密码
requirepass flyer0126 (redis.conf)
连接后auth授权或者登录时授权
auth flyer0126 || ./src/redis-cli -a flyer0126
2. 主从复制
特点:master可以拥有多个salve;多个slave可以连接同一个master外,还可以连接到其他的slave;主从复制不会阻塞master,在同步数据时,master可以继续处理client请求;提高系统的伸缩性。
主从复制过程:
slave与master建立连接,发送sync同步命令;master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存;后台完成保存后,将文件同步至salve;salve将文件保存到硬盘上。
配置主从服务器:
slave服务器上配置(redis.conf):
slaveof 主机ip 端口 #指定主机的ip及端口 masterauth flyer0126 #指定主机密码(权限)如何判定主从:info (role)
3. 事务处理
对事务的支持比较简单,只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令,当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令。
discard 取消当前事务
事务里的某一命令执行错误,整个事务不会回滚。
4. 持久化机制
snapshotting(快照) 默认 保存数据
将内存中数据以快照方式写入到二进制文件中,默认的文件名为dump.rdb,可以通过配置设置自动做快照持久化的方式,可以配置redis在n秒内如果超过m个key的修改就自动做快照。
save 300 10 #300s内如果超过10个key被修改,则发起快照保存。
由于快照方式是在一定间隔时间做一次的,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。
Append-only file(aof) 记录操作
比快照方式有更好的持久化性,使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件(appendonly.aof)中保存的写命令来在内存中重建整个数据库内容。
由于os会在内存中缓存write做的修改,不会立即写到磁盘上,这样aof的持久化还是有可能会丢失部分数据的修改。可以通过配置 通过fsync函数强制os写入磁盘的时机。
appendonly yes //启用aof持久化方式 # appendfsync always // 收到命令就写入磁盘,最慢,但是保证完全的持久化 # appendfsync everysec //每秒写入一次,在性能和持久化方面做了折中 # appendfsync no //完全依赖os,性能最好,持久化没保证
5. 发布订阅(Pub/Sub)消息
消息通信模式,主要解决消息发布和消息订阅之间的耦合。
Redis作为pub/sub的server,在订阅者和发布者之间起到了消息路由的功能。订阅者通过subscribe命令向redis server订阅自己消息类型,redis将消息类型成为通道(channel)。当发布者通过publish命令向redis server发送特定类型的消息时,订阅该消息类型的全部client都会收到此消息。
6. 虚拟内存的使用
Redis的虚拟内存与操作系统的虚拟内存不同,但思路和目的相同,暂时将不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。
对于redis,提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上。
虚拟内存配置 vm-enabled yes # 开启vm功能 vm-swap-file /tmp/redis-swap #交换出来的value保存的文件路径 vm-max-memory 1000000 #redis使用的最大内存上限 vm-page-size 32 #每个页面的大小32字节 vm-pages 134217728 #最多使用多少页面 vm-max-threads 4 #用于执行value对象换入的工作线程数量
五、图形化管理
Redis Desktop Manager
一款基于Qt5的跨平台Redis桌面管理软件
支持: Windows 7+, Mac OS X 10.10+, Ubuntu 14+
特点: C++ 编写,响应迅速,性能好。但不支持数据库备份与恢复。
项目地址: https://github.com/uglide/RedisDesktopManager
Redis Client
项目简介: 使用Java编写,功能丰富,缺点是性能稍差,网络不好时,会不时断线。
项目地址: https://github.com/caoxinyu/RedisClient
Redis Studio
项目简介: 又一个C++编写的redis管理工具,仅支持windows平台,支持xp操作系统。
项目地址: https://github.com/cinience/RedisStudio
六、示例项目
使用PHP利用Redis做数据库实现的示例项目,主要包括:用户登录、退出、添加、编辑、删除、分页、关注、取消关注等功能,主要目的为熟悉Redis各数据类型的应用。
具体实现代码见附件,为本人简单实现,欢迎拍砖~