1. 什么是Redis?简述它的优缺点

Redis本质上是一个Key-Value类型的高性能内存数据库 。Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份。

2. Redis 优势

1、速度快,Redis能读的速度是110000次/s,写的速度是81000次/s,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

2、支持丰富数据类型,支持string,list,set,Zset,hash等

3、支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

4、丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

3.Redis与MySQL的区别

1.类型上:

MySQL是关系型数据库,Redis是缓存数据库

2.作用上:

MySQL用于持久化的存储数据到硬盘,功能强大,速度较慢,基于磁盘,读写速度没有Redis快,但是不受空间容量限制,性价比高

Redis用于存储使用较为频繁的数据到缓存中,读取速度快,基于内存,读写速度快,也可做持久化,但是内存空间有限,当数据量超过内存空间时,需扩充内存,但内存价格贵

3.需求上

MySQL和Redis因为需求的不同,一般都是配合使用。 需要高性能的地方使用Redis,不需要高性能的地方使用MySQL。存储数据在MySQL和Redis之间做同步。

4.使用场景

(1)会话缓存(Session Cache)

最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗? 幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。

(2)全页缓存(FPC)

除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。 再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。 此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

(3)队列

Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。 如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。

(4)排行榜/计数器

Redis在内存中对数字进行递增或递减的操(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“userscores”,我们只需要像下面一样执行即可: 当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行: ZRANGE userscores 0 10 WITHSCORES Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。

(5)发布/订阅

最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!

5.Redis数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zsetsorted set:有序集合)。


String字符串:

格式: set key value

string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

string类型是Redis最基本的数据类型,一个键最大能存储512MB。


Hash(哈希)

格式: hmset name key1 value1 key2 value2

Redis hash 是一个键值(key=>value)对集合。

Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。


List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

格式: lpush name value

在 key 对应 list 的头部添加字符串元素

格式: rpush name value

在 key 对应 list 的尾部添加字符串元素

格式: lrem name index

key 对应 list 中删除 count 个和 value 相同的元素

格式: llen name

返回 key 对应 list 的长度


Set(集合)

格式: sadd name value

Redis的Set是string类型的无序集合。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。


zset(sorted set:有序集合)

格式: zadd name score value

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

6.基本的数据的增删改查命令

①添加键

127.0.0.1:6379> set name 'tzhang' OK 127.0.0.1:6379> set age 10 OK

②取键值

127.0.0.1:6379> get name         # 可以获取 "hello-redis"

③修改键

127.0.0.1:6379> set name 'hello-redis' OK

④删除键

127.0.0.1:6379> get name "qq" 127.0.0.1:6379> del name (integer) 1 127.0.0.1:6379> get name (nil)

7.持久化机制RDB、AOF

RDB

1.什么是RDB

RDB:每隔一段时间,把内存中的数据写入到磁盘的临时文件,作为快照,恢复的时候把快照文件读进内存。如果宕机重启,那么内存里的数据肯定会没有的,那么再次启动redis后,则会恢复。

2.RDB的优劣势

优势

1、每隔一段时间备份,全量备份(一个小时或24小时或30天的进行备份)

2、灾备简单,可远程传输

3、子进程备份的时候,主进程不会有任何io操作(不会有写入修改或删除),保证备份数据的完整性

4、相对AOF来说,当有更大文件的时候可以快速重启恢复

劣势

1、发生故障时,有可能会丢失最后一次的备份数据

2、子进程所占用的内容比较和父进程一模一样,如会造成CPU负担

3、由于定时全量备份是重量级操作,所以对于实时备份,就无法处理了

RDB适合大量数据的恢复,但是数据的完整性和一致性可能不足。

redis命令 set 时长 redis set效率_Redis


AOF

1.什么是AOF

AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

RDB会丢失最后一次备份的rdb文件,如果追求数据的完整性,那就考虑使用AOF。

2.AOF特点

以日志的形式来记录用户请求的写操作。读操作不会记录,因为写操作才会存储。

文件以追加的形式而不是修改的形式。

redis的aof恢复其实就是把追加的文件从开始到结尾读取执行写操作。

3.AOF的优劣势

优势

  1. AOF更加耐用,可以以秒级别为单位备份,如果发生问题,也只会丢失最后一秒的数据,大大增加了可靠性和数据完整性。所以AOF可以每秒备份一次,使用fsync(同步)操作。

  2. 以log日志形式追加,如果磁盘满了,会执行redis-check-aof工具。

  3. 当数据太大的时候,redis可以在后台自动重写AOF。当redis继续把日志追加到老的文件中去时,重写也是非常安全的,不会影响客户端的读写操作。

  4. 4.AOF日志包含的所有写操作,会更加便于redis的解析恢复。

劣势

  1. 相同的数据,同一份数据,AOF比RDB大。

  2. 针对不同的同步机制,AOF会比RDB慢,因为AOF每秒都会备份做写操作,这样相对与RDB来说就略低。每秒备份fsync没毛病,但是如果客户端的每次写入就做一次备份fsync的话,那么redis的性能就会降。

  3. AOF发生过bug,就是数据恢复的时候数据不完整,这样显得AOF会比较脆弱,容易出现bug,因为AOF没有RDB那么简单,但是呢为了防止bug的产生,AOF就不会根据旧的指令去重构,而是根据当前缓存中存在的数据指令去做重构,这样就更加健壮和可靠了。

redis命令 set 时长 redis set效率_redis_02