Redis应用介绍

来源:互联网 发布:阿里吧最新软件 编辑:程序博客网 时间:2024/06/06 08:57

Redis应用介绍

 

1 Redis简介

NoSQL数据库

Ø  NoSQL=Not Only SQL,是非关系型的数据库。是以Key-Value的形式存储,不一定遵循传统数据库的一些基本要求,例如:SQL标准、ACID属性(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)、结构化表结构等。

Ø  主要特性:非关系型的、分步式的、开源的、水平可扩展

Ø  适用场景:  High performance Huge storage High scalability&& HighAvailability

 

Redis数据库

Ø  基本介绍:Redis是一个开源的Key-Value存储系统,由ANSI C编写,开发由VMware主持。它支持存储的value类型有:string(字符串),list(链表), set(无序集合),zset(sorted set有序集合)和hash.可以把redis看成一个数据结构服务器。这些数据类型都支持pust/pop、add/remove及取交集、并集和差集运算,支持各种不同方式的排序。数据都是缓存在内存中的,它也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并实现了master-slave(主从)同步。

Ø  客户端语言: Redis提供的API语言包括C、C++、C#、Java、JavaScript、Lua、Objective-C、Perl、PHP、Python、Ruby、Go、Tcl等

Ø  应用场合:取最新N个数据的操作、排行榜应用、精确设定过期时间的应用、计数器应用、 Pub/Sub构建实时消息系统、构建队列系统、数据缓存

 

2 Redis安装步骤常用命令

安装准备

Ø  操作系统:Linux 64位

Ø  Redis版本: redis-2.8.9.tar.gz

Ø  安装目录: /home/robinjun

 

安装过程

Ø  解压:tar -zxvfredis-2.8.9.tar.gz

Ø  编译:进入解压目录执行make

Ø  安装:进入SRC目录执行 makeinstall

Ø  注:编译后src文件夹中的可执行程序

Ø  redis-server:服务器的启动程序

Ø  redis-cli:命令行工具,客户端

Ø  redis-benchmark:redis性能测试工具

Ø  redis-stat:状态检测工具(状态参数延迟)

参数修改

vi redis.conf

Ø  后台启动:daemonizeno -> daemonize yes

Ø  内存大小:#maxmemory <bytes>

                 maxmemory 1024m

 

服务命令

Ø  Redis启动: redis-server  redis.conf

Ø  验证端口: netstat-tnl | grep 6379

Ø  启动客户端连接:redis-cli

Ø  执行info命令:显示Redis服务的基本信息

Ø  关闭服务:pkillredis-server 

           或者 redis-cli shutdown 

           或者 redis-cli -p port shutdown

 

3 Redis参数配置介绍

daemonize         如果需要在后台运行,把该项改为yes

pidfile                  配置多个pid的地址,默认在/var/run/redis.pid

bind                   绑定ip,设置后只接受自该ip的请求

port                  监听端口,默认为6379

timeout                  设置客户端连接时的超时时间,单位为秒

loglevel            分为4级,debug、verbose、notice、warning

logfile                     配置log文件地址

databases           设置数据库的个数,默认使用的数据库为0

save   * *               设置保存快照的频率,第一个*表示多长时间,第二个*表示 执行多少次写操作。

                      在一定时间内执行一定数量的写操作时,自动保存快照。

rdbcompression 在进行镜像备份时,是否进行压缩

Dbfilename              镜像备份文件的文件名

Dir                         数据库镜像备份的文件放置路径

Slaveof               设置数据库为其他数据库的从数据库

Masterauth           主数据库连接需要的密码验证

Requirepass           设置登录时需要使用的密码

Maxclients             限制同时连接的客户数量

Maxmemory          设置redis能够使用的最大内存

Appendonly            开启append only模式

appendfsync           设置对appendonly.aof文件同步的频率,设置类型:

                            appendfsync always、appendfsynceverysec、appendfsync no

vm-enabled          是否虚拟内存的支持

vm-swap-file          设置虚拟内存的交换文件路径

vm-max-memory      设置redis使用的最大物理内存大小

vm-page-size          设置虚拟内存的页大小

vm-pages                  设置交换文件的总page数量

vm-max-threads       设置VMIO同时使用的线程数量

glueoutputbuf         把小的输出缓存存放在一起

hash-max-zipmap-entries 设置hash的临界值

activerehashing       重新hash

 

4 Redis与Memcached比较

 

5 Redis数据类型

5.1 String

String:是最简单的类型,一个KEY,一个VALUE,String类型是二进制安全的,可以包含任何数据,如图片或者已序列化的对象等信息。

应用场景:和Memcached应用一样,存储字符串类型的Key-Value,不错可操作功能要丰富很多。

重点方法

Ø  Set    set  key value[EX seconds] 将字符串值 value 关联到 key EX设置过期时间

Ø  Get   get key 返回 key 所关联的字符串值,不存在返回 nil

Ø  Setnx setnx key value 将 key 的值设为 value ,当且仅当 key 不存在

Ø  Setex setex key value seconds 将值 value 关联到 key 并设置过期时间,单位秒

Ø  Setrange  setrange key offsetvalue 用value覆写给定 key所储存的字符串,从偏移量offset开始

Ø  Mset mset key value [keyvalue ...]  同时设置一个或多个key-value 对

Ø  Msetnx    mget key value[key value ...] 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在

Ø  Getset      getset keyname keyvalue 将给定 key 的值设为 value ,并返回 key 的旧值

Ø  Incr   incr key 将 key 中储存的数字值增一

Ø  incrBy      incrby keyincrement 将 key 所储存的值加上增量 increment

Ø  Incrbyfloat incrbyfloat key increment 将 key 所储存的值加上增量 increment(小数)

5.2 List

List:是一个链表数据结构(双向链表),主要功能是push、pop,获取一个范围的所有值等,操作中key可以理解为List的名称。Redis中的List就是每个子元素都是一个String类型的双向链表,可以通过push、pop方法在链表的表头或表尾进行添加或删除元素,所以List既可以作为栈、也可以作为队列使用。

应用场景:系统的缓冲队列(如日志异步入库);微博粉丝列表;热点话题评论保持数据为5000条评论。


重点方法:

Ø  LPUSH    LPUSH key value[value ...]将一或多个值插入到列表 key 的表头

Ø  LRANGE  LRANGE  key start  stop 返回指定区间的元素

Ø  RPUSH   RPUSH key value[value ...] 将一或多个值插入到列表 key 的表尾

Ø  LSET       LSET key indexvalue  将下标为 index 的元素的值设置为 value

Ø  LREM     LREM key count value根据count,移除列表中与value相等的元素

Ø  LTRIM    LTRIM key startstop 保留指定区间内的元素

Ø  LPOP     LPOP  key 移除并返回列表 key 的头元素

Ø  RPOP     RPOP key 移除并返回列表 key 的尾元素

Ø  RPOPLPUSH RPOPLPUSH  source  destination 弹出一个元素后插入到另集合中

Ø  LLEN     LLEN  key 返回key中子元素的个数

5.3 Hash

Hash:Redis的hash类型是一个String类型的field和value的映射,hash适合存储对象(有多个属性),对象的每个字段存放单个的string类型,可以方便存取整个对象。

应用场景:存放用户信息(用户账号为key),每个field存放一个属性值;存放询价单信息(商品编码为key),每个厂家为field,值为报价


重点方法

Ø  Hset  hset  key field  value  设置一个field对应的值,如果key不存在,则新建该key

Ø  Hmset      hmset  key  field value [field  value ...]  同时设置多个field对应的值

Ø  Hincrby    hincrby keyfield increment  为key中的域 field 的值加上增量,正数加,负数减

Ø  Hincrbyfloat   hincrbyfloat keyfield increment 为field的值加上Double增量,正数加,负数减

Ø  Hexists     hexists keyfield 查看哈希表 key 中,给定域 field 是否存在

Ø  Hlen  hlen key      返回哈希表 key 中域的数量

Ø  Hdel  hdel key field[field ...]  删除哈希表 key 中的一个或多个指定域,不存在的域将被忽 

Ø  Hkeys       hkeys key     返回哈希表 key 中的所有域

Ø  Hvals hvals key      返回哈希表 key 中所有域的值

Ø  Hgetall    hgetall key    返回哈希表 key 中,所有的域和值

5.4 Set

Set:Redis是String类型的无需不重复集合,可以进行并集、交集、差集运算。最大元素个数2^32-1

应用场景:数据剔重;判断某个成员是否在一个set集合内(实现sns中的好友推荐)


重点方法

Ø  Sadd      SADD  key  member  [member ... ] 增加元素

Ø  Smembers      SMEMBERS  key 返回所有成员元素

Ø  Srem SREM  key  member [member ... ]  移除成员元素

Ø  Spop SPOP  key    弹出一个元素(随机)

Ø  Sdiff  SDIFF  key  [key ... ] 返回差集元素

Ø  Sdiffstore SDIFFSTORE  destination  key [key ... ] 返回差集并存储

Ø  Sinter       SINTER  key[key ...] 返回交集元素

Ø  Sunion     SUNION  key[key ...] 返回并集元素

Ø  Smove     SMOVE  sourcedestination member 移动元素到新集合

Ø  Sismember     SISMEMBER key member   判断是否为成员元素

5.5 Zset

Sorted Set :是普通set的一个升级,它在set的基础上增加了一个顺序属性,顺序属性在添加或修改元素时可以指定,每次指定后,Zset会重新按照新的顺序值进行调整。key可以理解为zset集合的名字,值可以理解有2列,一列正真的值,另一列存放顺序值。

重点方法:

Ø  ZADD   ZADD key scoremember [[score member] [score member] ...] 将一个或多个 member 元素及其 score 值加入到有序集 key 当中

Ø  ZREM   ZREM key member[member ...] 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略

Ø  ZRANK  ZRANK key member 返回有序集 key 中成员 member 的排名。其中有序集成员按score 值递增(从小到大)顺序排列

Ø  ZREVRANK  ZREVRANK  keymember返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从大到小)顺序排列

Ø  ZCARD  ZCARD key  返回有序集 key 的集合元素个数

Ø  ZCOUNT  ZCOUNT key minmax  返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量

Ø  ZRANGEBYSCORE ZRANGEBYSCORE  key min max [WITHSCORES] [LIMIT offsetcount]   返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按score 值递增(从小到大)次序排列

 

6. Redis-其他操作命令

Key命令:

Ø  KEYS pattern      KEYS *匹配数据库中所有 key ;KEYS h?llo 匹配 hello 、hallo 和 hxllo 等;KEYS h*llo 匹配 hllo 和 heeeeello 等

Ø  DEL key [key ...]          删除给定的一个或多个key 。不存在的 key 会被忽略

Ø  EXPIRE key seconds  给定key设置生存时间,当key过期时(生存时间为 0 ),它会被自动删除

Ø  PERSIST  key        移除给定 key 的生存时间设置,使其永不过期

Ø  RENAME key newkey 将 key改名为newkey ,当 key和newkey 相同或者 key 不存在时,返回一个错误

Ø  TYPE key                返回key所储存的值的类型

系统命令

Ø  QUIT、EXIT          请求服务器关闭与当前客户端的连接

Ø  SELECT index       切换到指定的数据库,数据库索引号 index 用数字值0-15,以 0 作为起始索引值。默认使用 0 号数据库

Ø  Dbsize             返回当前数据库当中key的数量

Ø  Info          获取服务器的信息

Ø  Config get             返回数据库配置信息

Ø  Flushdb           清除当前数据库中所有的key

Ø  Flushall           清除所有数据库中的所有的key(0-15数据库全被删除)

 

7. Redis高级应用

7.1安全性

密码验证:

主机:编辑 redis-conf 文件,找到requirepass 关键字,设置访问密码

从机:编辑 redis-conf 文件,找到masterauth 关键字,填写主机密码

绑定IP

编辑 redis-conf 文件,找到 bind 关键字,填写合法访问ip地址,多个ip以空格分开

7.2主从复制Master-Slave

主从复制原理:

Ø  当启动一个Slave进程后,它会向Master发送一个SYNCCommand,请求同步连接。

Ø  Master会启动一个后台进程,将数据快照保存到数据文件中,同时Master会记录所有修改数据的命令并缓存在数据文件中。后台进程完成缓存操作后,Master就发送数据文件给Slave。

Ø  Slave端将数据文件保存到硬盘上,然后将其在加载到内存中,接着Master就会所有修改数据的操作,将其发送给Slave端。

Ø  若Slave故障导致宕机,恢复后会自动重新连接,Master收到Slave的连接后,将其完整的数据文件发送给Slave。

Ø  如果Mater同时收到多个Slave发来的同步请求,Master在后台只启动一个进程保存数据文件,然后将其发送给所有的Slave。


主从配置

1)格式:slaveof<masterip> <masterport>

slaveof 192.168.128.160  6379

2)格式:masterauth<password>

masterauth  testpasswd

 

7.3事务处理

Multi,Exec

Multi和exec是成对出现使用,Multi开启事物,Exec提交事务。Redis客户端在执行multi后,客户端连接为阻塞模式,然后将多条动作命令添加到一个队列中,当执行Exec命令后,一起按照先后顺序执行。

注意:Redis事物不支持回滚,当在实行命令时出现语法错误,则事物失败;当没有语法错误,而在提交时,出现执行错误(如数据类型不匹配),则会忽略此条语句,其他正确执行的语句不再回滚。(Redis认为是程序编程的逻辑问题,为了保证效率,不支持回滚)。

Discard取消事物

乐观锁,CAS实现( check-and-set

Ø  WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。如果有至少一个被监视的键在 EXEC 执行之前被修改了,那么整个事务都会被取消, EXEC 返回空多条批量回复(null multi-bulk reply)来表示事务已经失败。

Ø  在业务编程端,如果事物失败,程序需要做的,就是不断重试这个操作,直到没有发生碰撞为止。这种形式的锁被称作乐观锁,是一种强大的锁机制。并且因为大多数情况下,不同的客户端会访问不同的键,碰撞概率小,通常并不需要重试。

7.4持久化

持久化方式

Ø  RDB:持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。

Ø  AOF:(append-only file)持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。

RDBAOF的选择

Ø  如果可以承受数分钟以内的数据丢失,则可以使用 RDB 持久化。

Ø  如果对数据一致性要求非常高,则可以使用AOF持久化

7.5 PUB/SUB发布与订阅

发布与订阅(pub/sub)

SUBSCRIBE 、 UNSUBSCRIBE 和 PUBLISH

信息格式

subscribe:表示当前客户端成功地订阅了信息第二个元素所指示的频道。而信息的第三个元素则记录了目前客户端已订阅频道的总数。

unsubscribe:表示当前客户端成功地退订了信息第二个元素所指示的频道。信息的第三个元素记录了客户端目前仍在订阅的频道数量。

message:表示这条信息是由某个客户端执行PUBLISH 命令所发送的,真正的信息。信息的第二个元素是信息来源的频道,而第三个元素则是信息的内容

7.6虚拟内存

实时处理能力

    Redis的虚拟内存就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用的。另外的能够提高数据库容量的办法就是使用vm把那些不经常访问的数据交换的磁盘上。

虚拟内存配置

vm-enabled          是否虚拟内存的支持

vm-swap-file         设置虚拟内存的交换文件路径

vm-max-memory      设置redis使用的最大物理内存大小

vm-page-size         设置虚拟内存的页大小

vm-pages                  设置交换文件的总page数量

vm-max-threads      设置VMIO同时使用的线程数量,0表示不使用工作线程(使用主线程)

工作原理

Ø  当vm-max-threads设为0时(BlockingVM),换出:主线程定期检查发现内存超出最大上限后,会直接已阻塞的方式,将选中的对象(redis会选择较老的对象。如果两个对象一样老会优先交换比较大的对象)保存到swap文件中,并释放对象占用的内存;当有client请求value被换出的key时;换入:主线程会以阻塞的方式从文件中加载对应的value对象,加载时此时会阻塞所以client。然后处理client的请求。

 


0 0