redis - 学习笔记回顾

  1. 什么是redis (C)
    reids是一个nosql数据库,中文:非关系型数据库
    nosql(not noly sql):不仅仅只有数据库
    关系型数据库:以二维表形式存储数据
    非关系型数据库:以键值对(key,value)存储数据

    redis是将数据存放到内存中,由于内存存取速度快,所以redis被广泛应用于互联网项目中,
    redis优点:存取速度快,操作具有原子性(保证高并发)
    缺点:对持久化支持不够良好
    所以redis一般不作为数据的主数据库存储,一般配合传统的关系型数据库使用。

  2. redis应用领域
    分布式锁
    分布式缓存
    分布式session session共享(不存服务器端了,直接取出来存到redis中,每回读取)
    保存博客或者论坛的留言回复等
    总之是用在数据量大,并发性高的情况下
    //分布式:一个业务分拆多个子业务,部署在不同的服务器上
    集群:同一个业务,部署在多个服务器上

  3. linux配置VMnet8. SecureCRT运行命令下载C++编译器。将redis压缩包上传到lunix。解压,编译。运行服务端,改conf改成后端运行,运行客户端存取,关闭客户端
    启动:/usr/local/redis/bin 下运行./redis-server & (后台运行)

  4. 怎么用
    redis主要就是使用命令来进行操作,java端在代码中可以使用Jedis来操作redis服务器
    redis数据类型:

    • 字符串String:
      set get del incr(数值+1) incrby(数值+指定值) decr(减) decrby
      应用:商品编号,订单号采用string的递增数字特性生成
    • 列表list:
      redis中使用的是双向循环链表来实现的,很像栈,可从左或右添加
      LPUSH key value… RPUSH key value… 从左或从右添加(像栈)
      LRANG key start stop(按索引从start查看到stop,stop=-1时代表最后一个素)
      LPOP key… RPOP key…. 从左或从右弹出元素
      LLEN key 获取列表中元素的个数
      应用:商品评论列表,评论信息。
    • 散列hash:
      一个对象可以又多个string字段
      HSET key field value…. 设置字段且赋值(可以多个直接跟着写)
      HGET key field 取字段值(可以多个,同上)
      HGETALL key 取字段及字段值
      HDEL key filed 删除字段
      应用:一般应用于将redis作为分布式缓冲时,存储数据库中的数据对象
    • 集合set:
      set中数据是无序且不重复的(hash表实现的应该)
      SADD key member… 增加元素,可以多个
      SREM key member… 删除元素,可以多个
      SMEMBERS key 获取key这个set的所有元素
      SISMEMBERS key member 判断元素是否在这个set中.返回1在0不在
      SDIFF key1 key2 集合1和2做差集运算
      SINTER key1 key2 交集运算
      SUNION key1 key2 并集运算
      应用:共同好友,共同粉丝等(交集)
    • 有序集合zset:
      redis会根据score(自己添加的数值吧)排序。可以用在成绩,销量等需要排序的数据上
      ZADD key score member …. 添加元素分数及元素
      ZSCORE key member 获取元素的分数
      ZREM key member… 删除元素
      ZRANGE key start stop [withscores] 获取某个范围内的元素排名,加withscores就是把分数也获取了,不影响排名,排名已经排好了
      ZREVRANG key start stop [withscores] 从大到小排
    • Java自定义对象:
      1.散列hash ?
      2.利用Jedis+序列化工具,将value(对象)序列化为二进制数组,存储到redis中,提取时再反序列化。
      利用序列化这样存取更快,并且内存空间占用极少。
  5. redis高级特性:
    redis的单个command都是原子性的,原因是大部分情况下(不考虑redis 3.x版本的某些情况下使用了多线程),redis是单进程单线程的,客户端的命令请求会被排队加入到一个内部queue中,redis会按顺序执行它们并返回。因此多个客户端并发请求也是没问题的。
    // redis的实现类似与node队列。

    • expire 设计键的生存时间,到期后自动删除
      expire key second(秒)
      ttl 查看键的剩余生存时间
      persist 取消生存时间
      应用场景: 限时的优惠活动信息 网站数据缓存(对于一些需要定时更新的数据,例如:积分排行榜) 手机验证码 限制网站访客访问频率

    • SETNX:设置一个key,不存在就设置,并且返回1,存在就不设置什么也不做。

    • delete :删除 key
    • SETNX,expire,delete一起配合使用,实现分布式锁。SETNX通过设置key获取锁,expire设置锁的自动过期时间(防止锁释放失败,避免死锁),delete释放锁
    • redis事务控制(不提供回滚,可结合watch使用)
      redis事务是基于先进先出队列实现的,multi之后的命令放入队列中,exec后队列中的命令一次执行。
      它不满足原子性(会部分不执行)、持久性(因为redis是在内存中、即使开启AOF,也存在命令执行一部分后,系统宕机而导致数据丢失的情况,不能恢复)、一致性(状态转移一半宕机了)。因为redis是单线程的,事务也是串行执行,所以满足隔离性。
      multi 事务开始
      exec 事物结束
      discard 放弃事物
      1:语法错误:致命的错误,事务中的所有命令都不会执行,即插入到队列时出错,队列所有的命令就都不执行了。
      2:运行错误:不会影响事务中其他命令的执行,即插入队列都成功,但从队列出来运行时出错,其他命令还会执行。
    • watch:命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC命令
      (事务中的命令是在EXEC之后才执行的,EXEC命令执行完之后被监控的键会自动被UNWATCH)
    • pipeline 管道
      redis的pipeline(管道)功能在命令行中没有,但是redis是支持管道的,在java的客户端(jedis)中是可以使用的。
      在插入更多数据的时候,管道的优势更加明显,插入数据更快。
      Pipeline pipelined = jedis.pipelined();
      for (int i = 0; i < 1000; i++) {
      pipelined.set(“bb” + i, i + “bb”);
      }
      pipelined.sync();
  6. redis持久化方案:(DBA做的事)
    rdb: 可以设置经过多长时间保存到硬盘一次。(redis默认的持久化方案)通过快照完成的
    就是一段时间保存到硬盘一次。
    优点:让redis的数据存取速度保持快(硬盘存取慢)
    缺点:服务器断电时会丢失部分数据(没到保存时间的就丢失了),数据的完整性得不到保证。
    aof:实时保存。
    可以通过设置redis.conf 设置实时保存。
    有点:持久化良好,保证数据完整性。
    缺点:大大降低了redis 系统的存取速度,性能就没那么好了(和关系型数据库不就一样了)

主从复制
这里写图片描述
从redis服务器用来做备份,实时向主redis发送命名,询问其是否出错,如果得不到回应其就暂时代替主redis,但它只能做读取操作,不能做增删改,要保证主从数据的一致性。从的数据来源:
设置好之后
主发送RDB文件给从
从将文件保存到磁盘上,然后加载到内存恢复
新生成的数据时主把缓存的命令转发给从,从进行操作(这样发送数据量比直接发数据小)。
所以从上位不时不能做增删改,只能读取。主好了之后还是主。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值