• 1. NoSQL之Redis——Kevin.Ren
  • 2. 什么是NoSQL?NoSQL是Not Only SQL的缩写,是不同于传统关系型数据库管理系统的统称。泛指非关系型的数据库。
  • 3. 分类A键值(Key-Value)存储数据库B列存储数据库C文档型数据库D图形(Graph)数据库
  • 4. NoSQL数据库的四大分类分类举例典型应用场景数据模型优点缺点键值(key-value)存储数据库okyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等Key 指向 Value 的键值对,通常用hash table来实现查找速度快数据无结构化,通常只被当作字符串或者二进制数据
  • 5. NoSQL数据库的四大分类分类举例典型应用场景数据模型优点缺点键值(key-value)存储数据库okyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等Key 指向 Value 的键值对,通常用hash table来实现查找速度快数据无结构化,通常只被当作字符串或者二进制数据 列存储数据库Cassandra, HBase, Riak分布式的文件系统以列簇式存储,将同一列数据存在一起查找速度快,可扩展性强,更容易进行分布式扩展功能相对局限
  • 6. NoSQL数据库的四大分类分类举例典型应用场景数据模型优点缺点键值(key-value)存储数据库okyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等Key 指向 Value 的键值对,通常用hash table来实现查找速度快数据无结构化,通常只被当作字符串或者二进制数据 列存储数据库Cassandra, HBase, Riak分布式的文件系统以列簇式存储,将同一列数据存在一起查找速度快,可扩展性强,更容易进行分布式扩展功能相对局限文档型数据库 CouchDB, MongoDbWeb应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容)Key-Value对应的键值对,Value为结构化数据数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构查询性能不高,而且缺乏统一的查询语法
  • 7. NoSQL数据库的四大分类分类举例典型应用场景数据模型优点缺点键值(key-value)存储数据库okyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等Key 指向 Value 的键值对,通常用hash table来实现查找速度快数据无结构化,通常只被当作字符串或者二进制数据 列存储数据库Cassandra, HBase, Riak分布式的文件系统以列簇式存储,将同一列数据存在一起查找速度快,可扩展性强,更容易进行分布式扩展功能相对局限文档型数据库 CouchDB, MongoDbWeb应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容)Key-Value对应的键值对,Value为结构化数据数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构查询性能不高,而且缺乏统一的查询语法图形(Graph)数据库Neo4J, InfoGrid, Infinite Graph社交网络,推荐系统等。专注于构建关系图谱图结构利用图结构相关算法。比如最短路径寻址,N度关系查找等很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案
  • 8. Redis的介绍Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。为了保证效率数据都是缓存在内存中,他也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
  • 9. readsApplicationswritesredis serverredis serverredis server 缺点:不安全 如果Redis宕机 内存被施放掉 数据会永久丢失 1、应用程序直接访问Redis数据库Redis试用场合
  • 10. 2、应用程序直接访问Redis,只有Redis访问失败时才访问MySQLRedis试用场合reads when redis missApplicationsW/Rredis serverredis serverW/Rredis SDKredis SDKMySQLMySQLMySQL
  • 11. Redis安装与下载wget http://download.redis.io/releases/redis-3.2.0.tar.gz tar -zxvf redis-3.2.0.tar.gz cd redis-3.2.0 make
  • 12. 启动Redis(Redis服务端默认端口号6379)默认情况下,Redis不是在后台运行的,我们需要把开启的Redis后台运行 redis.conf中将daemonize的值改为yes 查看是否启动 查看是否占用6379端口号 netstat -tunpl | grep 6379ps -ef | grep redisdaemonize yes
  • 13. 启动Redis(Redis服务端默认端口号6379)再次启动Redis 查看是否启动 客户端连接 /data/redis-3.2.0/src/redis-server /data/redis-3.2.0/redis.conf/data/redis-3.2.0/redis-clips -ef | grep redis
  • 14. Redis数据结构Hashes (散列)Lists (列表)String (字符串)Sets (集合)Sorted Sets (有序集合)Redis 数据结构
  • 15. strings类型strings是最简单的类型,一个key对应一个value值
  • 16. strings类型set 设置key对应的值为string类型的value get 获取key对应的string值,如果key不存在返回nil 127.0.0.1:6379> set name zhangsan OK 127.0.0.1:6379> get name "zhangsan"
  • 17. strings类型del 删除指定key的value值,如果key不存在,则直接忽略 127.0.0.1:6379> get name "zhangsan@163.com" 127.0.0.1:6379> del name (integer) 1 127.0.0.1:6379> get name (nil)
  • 18. strings类型strlen 取指定key的value值的长度 127.0.0.1:6379> get name "zhangsan" 127.0.0.1:6379> strlen name (integer) 8
  • 19. strings类型append 给指定key的字符串追加value,返回新字符串值的长度 127.0.0.1:6379> get name "zhangsan" 127.0.0.1:6379> append name @163.com (integer) 16 127.0.0.1:6379> get name "zhangsan@163.com"
  • 20. hashes类型hash 是一个string类型的field和value的映射表。它的添加、删除操作都是0(1)(平均)。hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型,将一个对象存储在hash类型中会占用更少的内存,并且可以方便的存取整个对象。
  • 21. hashes类型hset 设置hash field 为指定值,如果key不存在,则先创建 hget 获取hash feild的值 127.0.0.1:6379> hset user:001 name zhangsan (integer) 1 127.0.0.1:6379> hget user:001 name "zhangsan"
  • 22. hashes类型hlen 返回指定hash的field的数量127.0.0.1:6379> hget user:001 name "zhangsan" 127.0.0.1:6379> hlen user:001 (integer) 1 127.0.0.1:6379> hset user:001 age 22 (integer) 1 127.0.0.1:6379> hlen user:001 (integer) 2
  • 23. hashes类型hkeys 返回hash的所有key127.0.0.1:6379> hkeys user:001 1) "name" 2) "age"
  • 24. hashes类型hvals 返回hash的所有value127.0.0.1:6379> hvals user:001 1) "zhangsan" 2) "22"
  • 25. hashes类型hgetall 获取某个hash中全部的field及value127.0.0.1:6379> hgetall user:001 1) "name" 2) "zhangsan" 3) "age" 4) "22"
  • 26. hashes类型hdel 删除指定hashi的field 127.0.0.1:6379> hdel user:003 age (integer) 1 127.0.0.1:6379> hget user:003 age (nil)
  • 27. list类型list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等,操作中key理解为链表的名字。Redis的list类型其实就是一个每个子元素都是strings类型的双向链表。我们可以通过push、pop操作从链表的头部或者尾部添加删除元素、这样list既可以作为栈,又可以作为队列。
  • 28. list类型lpush 在key对应list的头部添加字符串 lrange 从list中取出一定范围(头第一个和尾最后一个元素)的元素127.0.0.1:6379> lpush mylist "word" (integer) 1 127.0.0.1:6379> lpush mylist "hello" (integer) 2 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "word"
  • 29. list类型rpush 在key对应list的尾部添加字符串127.0.0.1:6379> rpush mylist "word" (integer) 1 127.0.0.1:6379> rpush mylist "hello" (integer) 2 127.0.0.1:6379> lrange mylist 0 -1 1) "word" 2) "hello"
  • 30. list类型linsert 在key对应list的特定位置前或后添加字符串127.0.0.1:6379> lpush list3 one (integer) 1 127.0.0.1:6379> lpush list3 two (integer) 2 127.0.0.1:6379> lrange list3 0 -1 1) "two" 2) "one" 127.0.0.1:6379> linsert list3 before one three (integer) 3 127.0.0.1:6379> lrange list3 0 -1 1) "two" 2) "three" 3) "one"
  • 31. list类型rpush 在key对应list的尾部添加字符串127.0.0.1:6379> rpush mylist "word" (integer) 1 127.0.0.1:6379> rpush mylist "hello" (integer) 2 127.0.0.1:6379> lrange mylist 0 -1 1) "word" 2) "hello"
  • 32. list类型lset 设置list中指定下标的元素值127.0.0.1:6379> lpush list5 1 (integer) 1 127.0.0.1:6379> lpush list5 2 (integer) 2 127.0.0.1:6379> lpush list5 3 (integer) 3 127.0.0.1:6379> lrange list5 0 -1 1) "3" 2) "2" 3) "1" 127.0.0.1:6379> lset list5 1 two OK 1) "two" 2) "2" 3) "1"
  • 33. list类型lrem 从key对应list中删除n个和value相同的元素(n<0从尾删除,n=0全部删除)127.0.0.1:6379> lpush list5 4 (integer) 5 127.0.0.1:6379> lrange list5 0 -1 1) "4" 2) "4" 3) "two" 4) "2" 5) "1" 127.0.0.1:6379> lrem list5 1 4 (integer) 1 127.0.0.1:6379> lrange list5 0 -1 1) "4" 2) "two" 3) "2" 4) "1"
  • 34. list类型ltrim 保留指定key的值范围内的数据127.0.0.1:6379> lrange list5 0 -1 1) "4" 2) "two" 3) "2" 4) "1" 127.0.0.1:6379> ltrim list5 1 -1 OK 127.0.0.1:6379> lrange list5 0 -1 1) "two" 2) "2" 3) "1"
  • 35. list类型lpop 从list的头部删除元素,并返回删除元素127.0.0.1:6379> lrange list5 0 -1 1) "two" 2) "2" 3) "1" 127.0.0.1:6379> lpop list5 "two" 127.0.0.1:6379> lrange list5 0 -1 1) "2" 2) "1"
  • 36. list类型rpop 从list的尾部删除元素,并返回删除元素127.0.0.1:6379> lrange list5 0 -1 1) "2" 2) "1" 127.0.0.1:6379> rpop list5 "1" 127.0.0.1:6379> lrange list5 0 -1 1) "2"
  • 37. list类型lien 返回key对应list的长度127.0.0.1:6379> lrange mylist 0 -1 1) "4" 2) "hello" 3) "word" 127.0.0.1:6379> llen mylist (integer) 3
  • 38. sets类型sets是一个集合,他是string类型的无序集合。set是通过hash table实现的,添加、删除和查找的复杂度都是0(1)。对集合我们可以取并集、交集、差集。通过这些操作我们可以实现sns(社交网站)中的好友推荐和blgo的tag功能。
  • 39. sets类型sadd 向名称为key的set中添加元素 smembers 返回key集合所有的元素.127.0.0.1:6379> sadd myset "hello" (integer) 1 127.0.0.1:6379> sadd myset "world" (integer) 0 127.0.0.1:6379> sadd myset "world" (integer) 0 127.0.0.1:6379> smembers myset 1) "world" 2) "hello"
  • 40. sets类型srem 删除名称为key的set中的元素127.0.0.1:6379> smembers myset 1) "world" 2) "hello" 127.0.0.1:6379> srem myset "hello" (integer) 1 127.0.0.1:6379> smembers myset 1) "world"
  • 41. sets类型sdiff 返回所有给定key与第一个key的差集127.0.0.1:6379> smembers myset2 1) "2" 2) "3" 127.0.0.1:6379> sadd myset3 1 (integer) 1 127.0.0.1:6379> sadd myset3 2 (integer) 1 127.0.0.1:6379> smembers myset3 1) "1" 2) "2" 127.0.0.1:6379> sdiff myset2 myset3 1) "3"
  • 42. sets类型sinter 返回所有给定key的交集127.0.0.1:6379> smembers myset2 1) "2" 2) "3" 127.0.0.1:6379> smembers myset3 1) "1" 2) "2" 127.0.0.1:6379> sinter myset2 myset3 1) "2"
  • 43. sets类型sunion 返回所有给定key的并集127.0.0.1:6379> smembers myset2 1) "2" 2) "3" 127.0.0.1:6379> smembers myset3 1) "1" 2) "2" 127.0.0.1:6379> sunion myset2 myset3 1) "1" 2) "2" 3) "3"
  • 44. sorted sets类型sorted sets是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改的元素时可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。
  • 45. sorted sets类型zadd 向名称为key的zset中添加members,score用于排序。如果该元素存在,则更新其顺序。127.0.0.1:6379> zadd myzset 1 one (integer) 1 127.0.0.1:6379> zadd myzset 2 two (integer) 1 127.0.0.1:6379> zadd myzset 3 two (integer) 0 127.0.0.1:6379> zrange myzset 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "3"
  • 46. sorted sets类型zrevrange 返回名称为key的zset(按score从大到小顺序)中的index从start到end的所有元素。127.0.0.1:6379> zadd myzset 2 two (integer) 1 127.0.0.1:6379> zadd myzset 3 three (integer) 1 127.0.0.1:6379> zrevrange myzset 0 -1 withscores 1) "three" 2) "3" 3) "two" 4) "2" 5) "one" 6) "1"
  • 47. Redis安全性设置客户端连接后进行任何其他指定前需要使用的密码。 注:因为Redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟内进行150K次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。 redis.conf中配置 # requirepass foobared requirepass root
  • 48. Redis安全性设置完成后,重启服务,再进入 pkill redis-server 这里提示权限被禁止,设置权限 127.0.0.1:6379> auth root OK 127.0.0.1:6379> get name "zhangsan"127.0.0.1:6379> get name (error) NOAUTH Authentication required.
  • 49. Redis安全性连接服务器时指定口令[root@bogon redis-3.2.0]# redis-cli -a root 127.0.0.1:6379> get name "zhangsan"
  • 50. Redis主从复制Redis主从复制配置和使用都非常简单。通过主从复制允许多个Slaves Servers拥有和Master Servers的相同的数据库副本。
  • 51. Redis主从复制特点: Redis从2.8版本以后使用异步复制,从服务器会周期性的应答从复制流中处理的数据量 一个Master可以有多个Slaves 多个slave可以连接到同一个master外,还可以连接其他slaves(当master宕掉,另一个slave立刻变为master) 主从复制不会阻塞master,在同步数据时,master可以继续处理client请求(例如查询) 主从复制可以用来增强扩展性,使用多个slaves来处理只读的请求(比如,繁重的排序操作可以让slaves去做),也可以简单的用来做数据冗余Redis主从复制
  • 52. Redis主从复制Redis主从复制特点: 主从复制也不阻塞slaves。当从slaves进行初始同步时,它使用旧版本的数据来应对查询请求,假设你在redis.conf配置文件是这么配置的。否则的话,你可以配置当复制流关闭时让slaves给客户端返回一个错误。但是,当初始同步完成后,需要删除旧的数据集和加载新的数据集,在这个短暂的时间内,slaves会阻塞连接进来的请求。 使用主从复制可以为master免除把数据写入磁盘的消耗:在master的redis.conf文件中配置“避免保存”(注释掉所有“save“命令),然后连接一个配置为“进行保存”的slaves即可。但是这个配置要确保主服务器不会自动重启
  • 53. Redis主从复制Redis主从复制过程: SYNC commandMaster SlavefileinsertbackupsendSlave hdload
  • 54. Redis主从复制过程: 1、Slave与Master建立连接,发送SYNC同步命令 2、Master会启动一个后台进程,将数据库快照保存到文件中,同时Master主进程会开始收集新的命令并缓存 3、后台完成保存以后,将文件发送给Slave 4、Slave将此文件保存到硬盘上Redis主从复制
  • 55. Redis主从复制配置主从服务器: 在Slave服务器中配置redis.conf 主机密码 slaveof 192.168.171.128 6379 #指定master的ip 和端口号masterauth root #主机密码
  • 56. ANY QUESTIONS
  • 57. 谢谢观赏