Redis的特点
- redis 是单线程的,作者认为内存的存储已经够快不需要多线程
- 被称为数据结构服务器,易于处理集合运算
- 快速,每秒可处理高达10万次SET操作
- 拥有很多原子操作方法,容易保证数据的一致性
- 兼具临时性和永久性
Redis持久化
Redis的持久化用于服务器重启后能够快速的数据恢复
目前Redis持久化的方式有两种: RDB 和 AOF
RDB:
- RDB就是Snapshot快照存储,是默认的持久化方式。按照一定的策略周期性的将数据保存到磁盘。对应产生的数据文件为dump.rdb,通过配置文件中的save参数来定义快照的周
- 默认的快照设置(满足下列条件之一即进行快照保存):
save 900 1
save 300 10
save 60 10000- Redis 默认将快照文件存储在当前目录的dump.rdb,可通过配置文件的dir和dbfilename修改。
RDB 实现快照的过程
- 存储快照时,Redis 会复制一份当前进程的副本,副本进程和当前进程共享内存数据,如果要修改某个数据,会将该数据复制一份,以确保副本进程的数据不受影响。
- 当前的进程继续接收和处理客户端命令,副本进程开始将内存当中的数据写入到临时文件。
- 副本进程写入所有数据后,用临时文件替换当前的rdb文件。
- RDB的不足之处是,一旦数据库出现问题,那么快照文件中保存的数据并不是全新的,可能会有少量的丢失,即从RDB文件生成到Redis停机这段时间的数据。
RDB:
- AOF(Append-Only File)比RDB方式有更好的持久化性。Redis会将每一个收到的写命令都通过Write函数追加到文件中,类似于MySQL的binlog。
- Redis默认未开启AOF,可以修改配置 appendonly yes 来开启,开启后写命令会被依次记录到此文件。
- 将写命令记录到文件,有3个策略:
# appendfsync always 每次命令都写,最安全,性能最差
appendfsync everysec 每秒同步一次(默认)
# appendfsync no 不主动同步,由操作系统负责写入,约30秒一次
Redis 在满足一定条件时会自动优化AOF文件,即清理其中的冗余命令。对应的配置项
auto-aof-rewrite-percentage 100 当前的AOF文件大小超过上次重写时文件的百分比
auto-aof-rewrite-min-size 64mb 当AOF文件不足该大小时,不执行优化
可以同时开启RDB和AOF,redis重启后会使用AOF文件来恢复数据。
Redis启动
- 启动: redis-server /path/to/redis.conf
- windows: redis-server redis.conf
- linux: redis-server /etc/redis/redis.conf
- 也可以不指定配置文件
主 redis-server
从 redis-server –port 6380 –slaveof 127.0.0.1 6379
Redis 主从同步过程
- 从服务启动后,向主服务发送SYNC同步命令。
- 主服务接收到SYNC命令后开始保存快照,并将在此期间收到的写命令缓存起来。
- 快照成功后,将快照文件和缓存的命令发给从服务。
- 从服务收到后,载入快照文件并执行缓存的命令。
- 后续主服务收到的写命令,都会发送给从服务。
Redis 主从的特点
- master可以有多个slave
- slave可以继续拥有下级slave
- 主从同步不会阻塞master,但是会阻塞slave。
也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求,而slave在初次同步数据时则会阻塞,不能处理client的请求。
PHP Redis示例
<?php
// Redis客户端命令参考 https://github.com/nicolasff/phpredis
$redis = new Redis();
$redis->connect('127.0.0.1',6380);
$redis->set('username', 'sijiaomao');
echo $redis->get('username');
数据类型:
- 字符串(Strings)
- 字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任意类型的数据,例如: 一张JPEG格式的图片或者序列化的对象。一个字符串类型的值最多能存储512M的内容。
- 哈希(Hashes)
- 哈希表(也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。
- 在Memcached中,我们经常将一些结构化的信息打包成HashMap,在客户端序列化后存储为一个字符串的值,比如用户的昵称、年龄、性别、积分等。在需要修改其中某一项时,通常需要将其整体取出反序列化后,修改某一项的值,再序列化存储回去。这样不仅增大了开销,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。
- 列表(Lists)
- list类型其实就是一个每个子元素都是 String 类型的双向链表。一个列表最多可以包含2^32-1个元素(4294967295,40多亿)。
- 应用:最新消息排行、消息队列等。
- 集合(Sets)
- Redis集合是一个无序的字符串集合。你可以以O(1) 的时间复杂度完成添加、删除等操作。元素不能重复。一个集合最多可以包含2^32-1个元素。方便计算不同集合的交集、并集、差集等。集合可以通过sismember命令判断某值是否存在,列表无此命令。
- 应用:关注列表、粉丝列表、共同关注或粉丝等
- 有序集合(Sorted sets)
- Redis有序集合和集合类似,它们的差别是,每个有序集合的成员都关联着一个评分,这个评分用于把有序集合中的成员按最低分到最高分排列。
- 应用:各种有排序条件的列表,如热门文章等
Redis中对Key的常用操作
- exists(key):确认一个key是否存在
- del(key):删除一个key
- type(key):返回值的类型
- keys(pattern)返回满足给定pattern的所有key
- randomkey:随机返回key空间的一个key
- rename(oldname, newname)将key由oldname重命名为newname,若newname存在则删除newname表示的key
- dbsize:返回当前数据库中key的数目
- expire:设定一个key的活动时间(s)
- ttl:获得一个key的活动时间
- move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库
- flushdb:删除当前选择数据库中的所有key
- flushall:删除所有数据库中的所有key
Redis 命令参考网站:http://redis.readthedocs.org/en/latest/index.html