认识Redis

数据库 admin 1258℃ 0评论

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

转载请注明:My House » 认识Redis

喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址