第一部分---Redis简介
Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
【BSD协议:是一个给于使用者很大自由的协议。可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。当你发布使用了BSD协议的代码,或者以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:
一. 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
二.如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
三.不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
BSD代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销 售,因此是对商业集成很友好的协议。
很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者 二次开发。】
key-value数据库:一种以键值对存储数据的一种数据库,类似Java中的map或者是python中的dict,每一个键对应着唯一的值。其特点是具有较高的并发读写性能。
redis是属于Nosql类型的数据库,所谓的Nosql数据库,泛指非关系型数据库,是非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。
优点:
1.用户可以根据需要去添加自己需要的字段,为了获取用户的不同信息,不像关系型数据库中,要对多表进行关联查询。仅需要根据id取出相应的value就可以完成查询。
2.适用于SNS(Social Networking Services)中,例如facebook,微博。系统的升级,功能的增加,往往意味着数据结构巨大变动,这一点关系型数据库难以应付,需要新的结构化数据存储。由于不可能用一种数据结构化存储应付所有的新的需求,因此,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
不足:
只适合存储一些较为简单的数据,对于需要进行较复杂查询的数据,关系型数据库显的更为合适。不适合持久存储海量数据。
本文介绍的Redis就是一种针对于高并发读写的内存数据库。
Redis的一些特点:支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候再次加载使用。不仅支持简单的key-value格式,同时还提供了list,set,zset,hash等数据结构的存储。
Redis支持对数据的备份,即master-slave模式(主从设备模式)的数据备份。
Redis的优势:性能极高,redis能读的速度是110000/s,写的速度也可以达到81000/s。
有丰富的数据类型。
redis的所有操作都是原子型的,同时还支持对几个操作全并的原子性执行。
redis还支持publish/subscribe(发布/订阅)功能,通知,key过期等特性。
第二部分---Redis的配置说明
redis.conf配置项说明
1.Redis默认不是以守护进程的方式进行,可以通过该配置项修改,使用yes启用守护进程。
Redis使用的是单进程多线程的模式,当以守护进程的方式进行时redis可以在后台运行,并默认的将进程的pid号写入redis.conf指定的文件中,若不特殊进行指定则默认为var/run/redis.pid文件,此时redis会一直运行,除非手动kill掉程序。(pid是系统给程序运行的独一无二的标识)
若是设置成no,则当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具都会导致redis进程退出。
2.port 6379为指定Redis监听端口,默认的端口为6379,其含义是MERZ,一个意大利歌女的名字。
3.bind 127.0.0.1绑定的主机地址
4.timeout 300 当客户端闲置多长时间连接关闭,如果指定为0,表示关闭该功能
5.loglevel verbose 指定日志记录级别,一共四个级别,debug,verbose,notice,warning
debug:会打印出很多信息,适用于开发和测试阶段
verbose(冗长的):包含很多不太有用的信息,但比debug要清爽一些
notice:适用于生产模式
warning : 警告信息(只有特别严重的警告信息会记录在日志中)
6.logfile stdout 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,这里又配置日志为标准输出,则日志会发送给/dev/null
7.databases 16 设置数据库的数量,默认为数据库0,可以通过select 1(其他数字)连接上指定的数据库
8.save <seconds> <changes>指定多长时间内,执行了多少次更新操作,就将数据同步到数据文件,可以多个文件配合。
redis默认配置中的三个条件为900秒有1个更改,300秒有10个更改,以及60秒内有10000个更改。
- rdbcompression yes 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
- dbfilename dump.rdb指定本地数据库文件名,默认值为dump.rdb
11.dir ./指定本地数据库存放目录
12.slaveof <masterip><masterport> 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
13.masterauth<master-password> 当master服务设置密码保护时,slav服务连接master的密码
14.requirepass foobared 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时,需要通过AUTH<password>命令提供密码,默认关闭
15.maxclients 128 设置同一时间最大客户端的连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接,并向客户端返回max nunmber of clients reached
16.maxmemory <bytes>指定Redis最大内存限制,Redis在启动时会把数据加载都内存中,达到最大内存后,Redis会先尝试清楚已到期或即将到期的Key,此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Rdis新的vm机制,会把key存放内存,Value存放在swap区(虚拟内存)---2.6版本已经被弃用
17.appendonly no指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一部分数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no - appendfilename appendonly.aof 指定更新日志文件名,默认为appendonly.aof
- appendfsync everysec 指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
第三部分--Redis的数据类型
Redis支持的数据类型有String,hash,set,list,zset
较高级的数据类型包含hyperloglog数据结构,提供了不精确但快速的不重复计数方案,即寻找基数,在统计网站uv经常使用,在redis中含有16384个桶,对应的是214次,表示十四位2进制数,Redis通过一种Murmurhash的算法将数据流变成64为的哈希形式,前十四位用来找到存放的桶,分桶的意义在于能够更加准确的进行估计,分桶求平均再乘以桶数这一过程可以最大的降低误差,注意我们求平均的方式是调和平均也就是利用倒数进行平均,这样的话会对于有些地方出现的极大值进行有效的处理,而使结果更加的准确,后五十位进行前置找最大长度零的运算,也就是相当于对这个比特串进行抛硬币的一个过程,因为已经分好了桶,所以只需要保存前置零数目最大的那组值,因为Hyperloglog不对值进行保存,只是计算基数而已,桶是6bit位的,最多的0只可能到达五十,转换为2进制就是110010为6bit,所以桶为6bit位刚刚好。因为在数量较少时其误差较大,所以会采用稀疏矩阵的方式,只有当数目大于阈值之后才会转换成稠密矩阵,存储空间位214*6/8=12K
hyperloglog的语句:1. pfadd key element //向hyperloglog添加元素 如果没有该key对应的hyperloglog则新建
2. pfcount key //查询key对应的基数
3.pfmerge destkey sourcekey //将两个key进行合并,求共同的基数
较高级的数据类型还包含GEO,是一种对于地理位置的数据类型,有以下的功能,
1.GEOADD key longitude latitude member [longitude latitude member ...] //将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。
geoadd cityGeo【key】 121.472644 31.231706 "上海"【经纬度,名称】
2.GEODIST key member1 member2 [unit] //返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值 单位为m km mi ft
3.GEOPOS key member [member ...] //从key里返回所有给定位置元素的位置(经度和纬度)
geopos cityGeo 北京
4.GEOHASH key member [member ...] //返回一个或者多个地方的标准GEOHASH编码这个编码是个一维的字符串,经常利用于地图中,例如查询周围店家的时候经常会利用GEOHASH进行距离识别,可以用GEOHASH作为key,地址的营业信息作为value。一般来说字符串前缀内容匹配的越多,则内容越接近。
geohash cityGeo 北京
5.GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] //以指定经纬度为中心。返回在半径范围内的所有元素可以指定WITHDIST返回距离,WITHCOORD返回经纬度,WITHHASH返回geohash值
可以指定ASC或DESC,根据距离来排序 可以指定COUNT限定返回的记录数
georadiusbymember cityGeo 北京 100 km WITHDIST WITHCOORD ASC COUNT 5
6.GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] //与上面的类似,只不过这个是以地点为半径,进行检索
georadiusbymember cityGeo 北京 100 km WITHDIST WITHCOORD ASC COUNT 5