一、Redis简介
Redis属于Nosql 非关系数据库
Redis是Remote Dictionary Server(远程数据服务)的缩写
由意大利人 antirez(Salvatore Sanfilippo) 开发的一款 内存高速缓存数据库
该软件使用C语言编写,它的数据模型为 key-value
它支持丰富的数据结构,比如 String list(双向链表) hash(哈希) set(集合) sorted set(zset有序集合)
可持久化(保存数据到磁盘中),保证了数据安全
端口:6379
默认16个数据库,下标从0开始
二、redis 优点
①Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
②Redis支持数据的备份,即master-slave模式的数据备份。
③性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
④丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
⑤原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
⑥丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
三、应用场景
①[Sort Set]排行榜应用,取top n操作,例如sina微博热门话题
②[List]获得最新N个数据 或 某个分类的最新数据
③[String]计数器应用
④[Set]sns(social network site)获得共同好友
⑤[Set]防攻击系统(ip判断)等等
四、redis常见的性能问题
①Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
②如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
③为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
④尽量避免在压力很大的主库上增加从库
⑤主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...
这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。
五、对比memcache
①Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
②Redis支持master-slave(主—从)模式应用。
③Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
④Redis单个value的最大限制是512M, memcached只能保存1MB的数据
⑤redis是单核,memcached是多核
由于redis只能使用单核,而memcache可以使用多核,所以在比较上,平均每一个核上redis在储存小数据时比memccache性能更高。而却100K以上数据中,memcache性能要高于redis,虽然redis最近也在储存大数据的性能上进行优化,但是比起memcached还是有点逊色。结论是无论你使用那个,每秒处理请求的次数都不会成为瓶颈。
你需要关注内存使用率。对于key-vlaue这样简单的数据储存,memcache的内存使用率更高,如果采用hash结构,redis的内存使用率会更高,当然这都依赖于具体的应用场景
六、常见的性能问题及如何解决
①Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。
②Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
③Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
④Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内
七、数据结构命令
1.key
key的命名规则不同于一般语言,键盘上除了空格、\n换行外其他的大部分字符都可以使用
像“my key”和“mykey\n”这样包含空格和换行的key是不允许的。
我们在使用的时候可以自己定义一个Key的格式。
例如 object-type:id:field
Key不要太长。占内存,查询慢。
Key不要太短。像u:1000:pwd 就不如 user:1000:password:123456 可读性好
2.string
string是redis最基本的类型
redis的string可以包含任何数据。包括jpg图片 base64或者序列化的对象
单个value值最大上限是1G字节
如果只用string类型,redis就可以被看作加上持久化特性的memcache
3.list
key value(value1,value2,value3)
list类型其实就是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素
这使得list既可以用作栈,也可以用作队列
同一端进出 先进后出 栈
一端 另外一端出 先进先出 队列
首部(左 left) 尾部(右right)
4.set
redis的set是string类型的无序集合。集合里不允许有重复的元素
set元素最大可以包含(2的32次方-1)个元素。
关于set集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐功能。
5.zset
和set一样sorted set也是string类型元素的集合,有序集合,元素不允许重复
不同的是每个元素都会关联一个权。
通过权值可以有序的获取集合中的元素,可以通过score值进行排序
6.hash
Hash存储数据和关系型数据库(mysql),存储的一条数据的结构极为相似
Key:value(field:value)