Redis-初始

慕课学习

NoSQL:
   not only SQL
泛指:非关系型的数据库。

为什么需要NoSQL?
   1、高并发读写。
关系型数据库在面对上万的查询数据,能顶住,但是无法承受上万的写入。
   2、海量数据的高效率存储和访问。
   3、高扩展性和高可用性。

在基于WEB的架构当中,数据库是最难进行横向扩展。
   对于需要提供7*24小时不间断的网站来说,对于数据库系统,进行升级和扩展,就是非常痛苦的事情了,往往需要停机维护或数据迁移,当用户的访问量与日俱增的时候,数据库服务是没办法通过添加硬件来搭建负载均衡的服务器。
   为什么数据库不能通过添加服务器节点实现呢?
这时NoSQL数据库的产生,解决了大规模数据库集中,并且数据种类不通,所带来的挑战。
尤其是大数据应用的难题,

主流的NoSQL产品:
   CouchDB、Redis、Cassandra、mongoDB、membase、riak、、
Redis应用比较广泛。
NoSQL数据库的四大分类:
   1、键值(Key-Value)存储
像:Redis数据库。
优点:
   查询快速。
缺点:
   存储的数据缺少结构化。
   2、列存储
像:Hbase数据库
优点:查找速度比较块。扩展性强。
缺点:功能相对于局限。
   3、文档数据库
像:mongoDB数据库。
优点:数据结构要求不是特别严格。
缺点:查询性能不是特别高。缺少:统一查询的语法。
   4、图形数据库
像:infoGrid数据库
应用多于在社交网络上。
优点:利用图结构的相关算法。
缺点:需要对整个图进行计算才能得出结果。不适于分布式的集群方案。

四类NoSQL数据库比较
分类 先关产品 典型应用 数据模型 优点 缺点
键值(Key-value) Tokyo Cabinet/Tyrant、Redis、Voldemort、BerkeleyDB 内容缓存,主要用于处理大量数据的高访问负载 一系列键值对 快速查询 存储的数据缺少结构化
列存储数据库 Cassandra、HBase、Riak 分布式的文件系统 以列簇式存储,将同一列数据存在一起 查找速度快,可扩展性强,更容易分布式扩展 功能相对局限
文档型数据库 CouchDB 、MongoDb Web应用(与key-value类似,Value是结构化的) 一系列键值对 数据结构要求不严格 查询性能不高,而且缺乏统一的查询语法
图形(Graph)数据库 Neo4J、InfoGrid、Infoinite Graph 社交网络、推荐系统等。专注于结构关系图谱 图结构 利用图结构相关算法 需要对整个图做计算才能得出结果,不容易做分布式的集群方案。

NoSQL的特点:泛指非关系型数据库,都去掉了关系型数据库中的表关系。所以数据之间是没有关系的。
   1、依扩展
   2、灵活的数据模型。对于大数据量,高性能读写非常灵活。不需要对事先存储的数据建字段。
   3、大数据量,高性能。存储。具有非常高的读写性能。
   4、高可用。在不太影响性能的情况下,就可以很方便的实现一些高可用的一些框架。

flushall 清空数据库。


Redis的概述:
   c语言开发的,开源的,高性能的,键值对的数据库。通过提供多种键值数据类型,来适应不同的场景需求。
支持的类型:
1、字符串类型
2、列表类型
3、有序结合类型
4、散列类型
5、集合类型


Redis的数据结构:
type key #查看key的存储类型
五种数据类型:
   1、字符串(String)
二进制方式操作(安全),存入和获取的数据是相同的。字符串类型的value最多可容纳数据的长度是:512M。
常用命令:
   赋值: set key  value(如:set name mark)
   删除: del key (如:del name)
   取值: get key (如: get name)
   扩展命令:getset key value (如:getset name jeck)
   数值增减: incrby num 5(递增5,如果这个key不存在,则默认设置为0,再加5,结果:5.)
              decrby num 3(递减3,)
   递增值:incr key(如果这个key没有,会将这个值设置为0,并且加1。结果:1如果是字符串key,则会报错异常。)
   递减值:decr key(如果这个key不存在,则将这个设置为0,减1,结果:-1)
   追加:append num 5 : 在key值num对应的值后拼接5,结果35,执行后:返回的是value的长度。如果没有这个key则会创建并赋值存储。

   查询my开头的key: keys my? #所有的某些。
   查询某个key是否存在: exists mykey1 #存在返回:1,不存在放回:0  

   删除多个key: del mykey1 mykey2 mykey3
  
   重命名:key : rename oldkey  newkey.

   设置过期时间: expire key 1000 #过期时间一千秒。
   查看剩余的超时时间: ttl key #如果没有设置返回-1.

   查看key的类型: type  key

   2、字符串列表(list)
是按照插入顺序,排序的,一个字符串的链表。
在插入的时候,如果键不存在,就会为这个键创建一个新的链表,如果链表中的键都被移除,则该链表也会被移除。
如果在2头插入数据是非常高效的,如果插入和删除在链表的中间,效率就相对于较低。
 
1、ArrayList使用数组方式,所以根据索引查询速度是非常快的。而新增和删除相对于较慢。
2、LinkedList使用双向连接方式。每个元素都记录了前后元素的指针。所以插入数据的时候只是改变了前后元素指针的指向,所以速度就比较快。
3、双向链表中增加数据。
4、双向链表删除数据。

存储: 从左侧添加: lpush mylist a b c #是左侧叠加,也就是a在最右。第一个位置的在右侧,最后加入的在左侧。
   结果是c在最上。从下往上
       从右侧添加: rpush mylist2 a b c #右侧叠加。 获取时候是顺序显示。从上往下
查看:  lrange mylist # -1是尾部:查看到尾部。-2是倒数第二个:查看到倒数第二个。查看必须根起始位置,否则报错。

弹出头部元素: lpop mylist #删除左侧第一个。并返回该元素。
弹出尾部元素: rpop mylist2  #删除右侧第一个。并返回该元素。

查看列表长度: llen mylist #返回长度,如果查询的list不存在,返回:0。

列表存在,元素插入头部:lpushx mylist x #mylist存在则将x元素插入到mylist头部。如果列表不存在返回:0。rpushx功能类似。

列表中可以有相同的元素。
lrem mylist 2 3 #从头部开始删除3这个元素,删除2个。
lrem mylist -2 1 #从尾部删除1这个元素,删除2个。
如果lrem删除没有的元素,返回:0.

操作下标,不存在抛出异常。
在指定位置插入元素: lset mylist 3 mm #在小标3的位置插入mm元素。

在指定元素前插入元素: linsert mylist before b 11 #在b元素前插入11元素。
在指定元素后插入元素: linsert mylist after b 22 #在元素b后插入元素22

将A列表尾部元素删除,添加到B列表的头部: rpoplpush mylist1 mylist2 #将mylist1尾部元素删除,添加到mylist2的头部
rpoplpush使用的场景:链表经常会用于,消息队列的一些服务,来完成多个程序之间的消息交互。假设一个应用程序,正在执行lpush向链表中去添加新的元素,通常将这样的程序称之为:生产者。另一个程序正在执行:rpop(删除右侧第一个元素)操作,从链表中取出元素,通常称之为:消费者。消费者程序,在取出元素后,立刻崩溃了,由于该消息已经被取出,且没有被正常处理,就可以认为这个消息已经丢失了,由此可能造成业务数据的丢失,或业务状态的不一致等现象发生。此时就可以通过:rpoplpush命令,当消费者程序在主消息队列中,取出元素后,再将这个元素插入到一个备份的链表队列当中,直到消费者程序完成正常的逻辑处理后,再将消息从备份链表队列中删除,这样可以提供一个守护的线程,当发现备份链表队列中的消息过期的时候,可以将消息重新返回到主消息队列当中,以便其他的消费者程序可以继续处理。  。通过rpoplpush产生一个备份的链表,将所有需要处理的数据当处理时备份,当业务处理完后将备份链表删除。



   3、字符串集合(set)
没有排序的字符集合,和list类型一样。
1、和list类型不同的是,set集合中不允许出现重复的元素。
2、set可包含的最大元素数量是:4294967295
一个非常重要的特性:在服务器端完成多个 size  之间的一个聚合计算操作,如:Unix,difference,这些操作都是在服务器端完成的,因此效率非常高。可以节省大量的网络开销。

添加元素:sadd myset a b c #向myset中添加3个abc元素。

删除元素: srem myset a b #删除掉ab2个元素。

查看set中的元素: smembers myset #查看
查看set中的元素数量: scard myset #返回元素的总数量。
查看2个集合set的交集:sinter myset1 myset2 # 返回交集的所有元素。

判断某个元素是否存在set中:sismember myset a #存在返回:1. 0:不存在。

随机返回set中的元素: srandmember myset 

俩个集合的交集存储: sinterstore my2 myset1 myset2 #将myset1和myset2的交集存储到my2.

俩个集合的并集存储: sunionstore my3 myset2 myset3 #将myset2和myset3的并集结果存储到my3。
使用场景:
     1、跟踪一些唯一性数据
     2、用于维护数据对象之间的关联关系。
   可以用set来跟踪一些具有唯一性的数据,比如:访问某一博客的唯一IP地址的信息。在每次访问该博客的时候,将访问者的IP存到Redis中,而set数据类型就会保证这个IP地址的唯一性。并且还可以充分利用set类型的服务器端聚合操作的方便,高效的,等特性,可以用于维护数据对象之间的一些关联关系。
如: 所有购买某个电子设备的客户的ID,被存储到一个 指定的set当中,而购买另外一种电子产品的用户ID,被存储到另外一个set中,如果这时候需要统计,有哪些用户同时购买了这2中商品,这个时候就可以使用,set的交集操作,









   4、哈希(hash)
String key 和 String Value的map容器。适合存储:值-->对象的信息。
每个Hash可以存储4294967295个键值对

查询hash中是否存在某个key:hexists myhash username #返回1存在。没有返回0.
查询hash中存储了多少键值对:hlen  myhash 
获取所有的key: hkeys myhash
获取所有的Value:hvals myhash 

存储:hset myhash usernaem jeck #单个键值对存储
      hset myhash  userage 18
      hmset myhash2 username mark age 18 #多个键值对存储
获取:hget myhash username #获取单个键的值:username键对应的值。
      hmget myhash2 username age #获取多个键对应的值。
获取整个hash: hgetall myhash #

删除: hedel myhash2 username age #删除多个属性。 如果删除的key不存在,返回:0.表示不存在。
      del myhash2 #删除整个hash。

拼接:hincrby myhash age 5 #原值:18。拼接后是:185

   5、有序字符串集合(sorted-set)

都是字符串的一个结合,都不允许一个set中有相同的元素。

sorted-set和set的区别:
   sorted-set中的每一个成员,都会有一个分数与之关联,而 Redis正是通过这个分数来为集合中的元素从小到大的一个排序。
   尽管sorted-set中的元素是唯一的,但是分数缺失可以重复的,所以添加,删除,更新一个元素效率都是很高的。事件复杂度:为集合中成员的个数的一个对数。
   sorted-set中的元素在集合中位置是有序的,所以访问中间部分的元素也是非常高效的,所以这个Redis的这个特征,在其他类型的数据库中都是很难实现的。也就是说:在该点上,要想达到和Redis同样的高效,在其他的数据库中,进行建模是非常困难的。

添加: zadd mysort 70 zsan 80 lisi 90 wwu
添加重复的元素:zsan: zadd mysort 100 zsan #将原有的替换,返回修改的结果:0。
添加新的元素: zadd mysort 60 tom #返回修改的结果:1

查看zsan对应的分数: zscore mysort zsan #返回zsan元素对应的分数。
查看元素的总个数: zcard mysort
查看某个元素的分数: zscore mysort zsan #返回zsan对应的分数

查看所有的元素: zrange mysort 0 -1
从小到大查看元素及其分数: zrange mysort 0 -1 withscores #返回结果由小到大排序。
从大到小查看元素及其分数: zrevrange mysort 0 -1 withscores #返回结果由大到小

删除元素: zrem mysort tom wwu #返回修改结果2,删除2个元素:tom wwu
按照排名的范围删除: zremrangebyrank mysort 0 4
按照分数进行删除: zremrangebyscore mysort 80 100 #删除分数在80到100之间的元素。
 
扩展命令:
 返回分数在某个之间的元素并按照分数的从低到高排序,
zrangebyscore mysort 0 100 #返回分数0到100的元素。
zrangebyscore mysort 0 100 withscores #返回结果0到100之间并显示对应的分数。
zrangebyscore mysort 0 100 withscores limit 0 2 #返回对应元素的2个。

增加某个元素的分数:
   zincrby mysort 3 lis  #元素lis对应的分数加3 。

获取分数在某个之间的一些元素的个数:
   zcount mysort 80 90 #返回的是 80分到90分之间的元素个数。
主要应用场景:
   在游戏的排名上(通过zadd重新添加元素对应的积分,从而更新玩家的几分数,zrange排序),微博的热点话题,构建索引数据等。


Key定义的注意点:
   1、不要太长。不超过1024个字节。会消耗内存,也会降低查找的效率。
   2、不要太短。降低可读性。
   3、统一的命名规范。

Keys的通用操作:
显示所有的kes: 
   keys *  #返回:mylists2 mylist3 mysort

查询显示以my开头的key:
   keys my? #返回所有my开头的key

删除key:
   del my1 my2 my3 #删除3个key,返回结果个数。

查看某个key是否存在:1:存在。 0:不存在。
   exists my1 #存在返回1,不存在返回0

重命名key
   rename oldname newname #成功返回OK。

设置过期时间:单位:秒
   expire keyname #返回结果个数
查看剩余的超时时间:
   ttl keyname #返回剩余的有效时间。如果没有设置:返回 :-1

查看key的类型:
   type keyname #返回key的类型(String、list、set、hash、zset:sort-set)

将某个key移动到指定的数据库中:
   move myset 1 #将myset 移动到1号数据库 (myset是set类型)




高性能体现:官方给的数据,也只做参考。
有50个并发程序,来执行10W次请求,Redis读的速度:能达到:11W/秒。 写的速度:能达到 81000/秒

Redis的应用场景:
   1、缓存, 比如:数据查询,新闻,商品内容。
   2、任务列表。 比如:在线聊天室的好友列表。秒杀,抢购等
   3、网站访问统计。
   4、数据过期处理。 可以精确到毫秒
   5、应用排行榜。
   6、分布式集群架构中的 session 分离。


Redis特性
  一个Redis实例可以包含多个数据库,客户端也可以执行连接Redis实例的数据库。最多可提供16个数据库,小标从:0到15,客户端默认连接的是:0数据库。
   select 1 #选择1号数据库。
   移动key到另一个数据库:move mykey 1 #将mykey移动到1号数据库。

   1、多数据库
   2、Redis事务
 使用multi exec discard 3个命令实现事务。
multi:开启一个事务。
exec:提交。
discard:回滚。
  事务中所有命令将被串行化顺序执行,期间Redis不会为其他的客户端提供任何服务,从而保证事务中的所有命令都被原子化执行。
  和关系型数据库相比 : 在Redis中如果某个命令执行失败了,后面的命令还是会被执行,可以通过:multi 开启一个事务,此后所有执行的命令都被识别成是一个事务的操作, exec提交这个事务,discard:回滚这个事务。
   在事务开启之前,如果客户端与服务器端出现通讯故障,并导致网络断开,那么之后所执行的语句都将不会被服务器执行,如果网络中终端这个事件,发生在客户端执行exec提交事务之后的,那么所有命令都会被服务器执行。


Rdeis持久化:
  Redis的高性能是由于自身所有的数据都存储在了内存当中,为了使Redis在重启之后仍保持数据不丢失,那么就需要将数据从内存当中同步到硬盘上,这个过程称之为:持久化操作。

 俩种持久化方式:
  1、RDB方式
  2、AOF方式
 可以使用1种,或结合俩种使用,

持久化使用的方式:
   1、单独使用RDB持久化。默认支持的,不需要配置。
 在指定的时间间隔内,将内存中的数据及快照写入到磁盘。在多少秒后,将数据写入到磁盘一次。
RDB优点:
   1、如果采用RDB方式,整个Redis的数据库将会只包含一个文件,进而对文件备份而言是非常完美的,
比如:每个小时归档一次最近24小时的一个数据,同时还要每天归档一次最近30天的数据,进而可以通过这样的备份侧率,一旦系统出现故障,可以非常容易的进行恢复。
   2、对于灾难恢复而言,RDB是非常不错的选择,因为只包含了一个文件,进而可以压缩打包这个文件转移到备份服务器上。
   3、性能最大化。
  对Redis的进程而言,在开始持久化的时候,唯一需要做的只是分叉出一些进程,之后再由子进程完成持久化的工作,从而避免了服务器进程执行IO的操作了,相比AOF机制,如果数据集很大,RDB启动的效率会更高。

RDB缺点:
   1、如果要保证数据的高可用性,就是最大限度的避免数据的丢失,RDB不是很好的选择,因为系统一定在定时持久化之前出现一些宕机的情况,从而还没来得及往硬盘写数据就丢失了。
 比如:30秒往磁盘写一次数据,如果在25秒时候宕机了,那么这前25秒的数据就没有了。 
   2、由于RDB通过forword分叉的方式,子进程来协助完成数据持久化工作的,因此如果当数据集非常大的时候,会导致服务器停止几百毫秒甚至一秒钟。

配置文件:
  save 900 1 #每15分钟,至少有1个key发生变化,那么就会持久化一次,就会照内存的一个快照。
  save 300 10 #每5分钟,至少有10个key发生变化,会往硬盘写一次,
  save 60 10000 #没1分钟,至少有1万个key发生变化,会写如磁盘一次。
RDB保存的文件: 
  dump.rdb #自动生成的。

   2、AOF方式
 将以日志的形式记录服务器所处理的每一个操作,在Redis服务器启动时,会读取该文件,来重新构建数据库,进而保证启动后数据库中的数据是完整的。
AOF优点:
   1、可以带来数据更高的安全性。
Redis中提供了3中同步侧率,
   每秒同步。#每秒同步也是异步完成的,效率非常高,然而:一旦系统出现宕机现象,那么这个1秒钟修改的数据就会丢失,
   每修改同步。 #可以立即成:同步持久化,每发生数据的变化都会被记录到磁盘当中,这种效率相对低。但是是最安全的。
   不同步
  2、由于这种机制,对于日志的写入操作采用的是append的模式,也就是追加的模式,因此在写入过程中,即使出现了宕机的现象,也不会破坏日志文件中已经存在的内容,如果只写入了一般的数据就出现了系统崩溃的问题,在Redis下一次启动之前,可以通过Redis-check-aof这个工具,来帮助解决数据一致性的问题。
  3、如果日志过大,Redis会自动启动重写机制。Redis以append追加的方式不断的将修改的数据写入到老的磁盘当中,同时Redis也会创建一个新的文件用于记录在此期间产生了哪些修改命令被执行了。因此在进行重写切换的时候,可以更好的保证数据的安全性。
  4、AOF包含一个,格式非常清晰易于理解的日志文件,用于记录所有的修改操作,也可以通过这个文件完成数据的重建。

AOF缺点:
   1、对于相同数量的数据集而言,AOF的文件要比RDB的文件大。
   2、根据同步侧率的不同,AOF在运行效率上低于RDB,因为每修改就同步到磁盘效率故而低与RDB,
默认情况下AOF方式模式是关闭的。默认使用的是:RDB的方式。


将:appendonly yes

always:每修改就会同步到磁盘上,
everysec:每秒同步一次。

更安全的话:选择 always侧率。
需要注意的是:AOF会记录所有操作的命令,包括flushall命令。

   3、无持久化
 可以通过配置、禁用Redis服务器的持久化的功能,可以认为,Redis就是一个缓存的机制,
   4、同时使用RDB和AOF
 




Redis的安装
  下载后: tar xf redis-4.0.1.tar.gz 直接 make 

安装:
[root@redis redis-4.0.1]# make PREFIX=/usr/local/redis install


redis-benchmark: 性能测试工具。
redis-check-aof:aof文件修复的工具。
redis-check-rdb:rdb文件检查的工具。
redis-cli:命令行客户端
redis-server:redis服务启动的命令。

拷贝配置文件:

这时候就可以启动了: bin目录下 redis-server 执行即可启动,但是这属于前端启动。占用了界面。导致无法做其他操作。
./redis-server  #前端启动方式。

后台启动:修改配置文件。

修改后,启动的时候需要指定配置文件:
  redis目录下:

停止redis:
   ./bin/redis-cli shutdown



查看是否运行正常:



存数数据:



删除数据:



查看数据库中存储的key:





Jedis 对Redis的连接的基本操作。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值