Redis学习(一)
1.简介
redis是一个高性能key-value数据库,本身基于ANSI C语言实现,支持多种语言的API
2.redis支持的数据类型
key:只支持字符串类型,且不能包括边界字符($等等)、空格和换行符(\n).
value : 支持String、hash、list、set和Zset五种数据类型
1.String类型
string 是最基本的类型,而且 string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。从内部实现来看其实 string 可以看作 byte数组,最大上限是 1G 字节。
2.hash类型
hash 是一个 string 类型的 field 和 value 的映射表。添加,删除操作都是 O(1) (平均) 。hash 特别适合用于存储对象。相对于将对象的每个字段存成单个 string 类型。将一个对象存储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新建一个 hash 对象时开始是用 zipmap(又称为 small hash)来存储的。这个 zipmap 其实并不是 hash table,但是 zipmap 相比正常的 hash 实现可以节省不少 hash 本身需要的一些元数据存储开销。尽管 zipmap 的添加,删除,查找都是 O(n),但是由于一般对象的 field数量都不太多。所以使用 zipmap 也是很快的,也就是说添加删除平均还是 O(1)。如果 field或者 value的大小超出一定限制后,redis会在内部自动将zipmap替换成正常的hash实现.这个限制可以在配置文件中指定。
3.list类型
list 是一个链表结构,可以理解为一个每个子元素都是 string 类型的双向链表。主要功能是 push、pop、获取一个范围的所有值等。操作中 key 理解为链表的名字。
4.set类型
set 是无序集合,最大可以包含(2 的 32 次方-1)个元素。set 的是通过 hash table 实现的 ,所以添加,删除,查找的复杂度都是 O(1)。hash table 会随着添加或者删除自动的调整大小 。需要注意的是调整 hash table 大小时候需要同步(获取写锁)会阻塞其他读写操作。可能不
久后就会改用跳表(skip list)来实现。跳表已经在 sorted sets 中使用了。关于 set 集合类型除了基本的添加删除操作,其它有用的操作还包含集合的取并集(union),交集(intersection) ,差集(difference)。通过这些操作可以很容易的实现 SNS 中的好友推荐和 blog 的 tag 功能。set 类型数据操作指令简介
Zset类型
Zset 是有序集合,它在 set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,会自动重新按新的值调整顺序。可以理解了有两列的mysql表,一列存 value,一列存顺序。操作中 key 理解为 sorted set 的名字
3.数据持久化
快照方式(默认)
所谓快照,就是每隔一段时间将内存中的数据以二进制文件的形式保存到物理磁盘中,文件的默认名为dump.rdb
缺点:
1.保存快照是在主线程中实现,这种方式会阻塞所有客户端的请求
2.每次保存都是将内存中的数据完整的写入磁盘,数据量较大时会引发大量的磁盘IO操作,严重影响性能
2.以时间间隔去保存数据,如果服务器意外宕机,则会导致上次保存到宕机期间产生的数据丢失
日志追加方式(redis.conf配置文件的appendonly置为yes)
简介:redis会在收到写命令时,通过write函数追加到文件中(文件名默认appendonly.aof)
数据恢复:redis重启时会检测该文件,并将该文件中的数据全部载入内存中
写入磁盘方式:(可以通过修改redis.conf配置文件的appendfsync参数)
1.always:每次收到写入命令立即强制写入磁盘。
优点:保证数据完整性
缺点:频繁触发磁盘io操作,影响性能(3.0版本后,redis支持集群,推荐使用这种方式保证数据的完整性)
2.everysec:每秒钟强制写入磁盘一次
缺点:不能保证数据完整性(例如,一秒钟禅城1w条数据,0.99宕机,则这部分数据丢失)
3.no:完全依赖操作系统,由系统根据环境适时将数据持久化到磁盘中(数据完整无法保证,不推荐使用)