【Redis6】Redis6笔记

文章目录

1、NoSQL数据库简介(非关系型数据库)

1.1在web2.0时代出现了大量用户上网,出现了两个压力

在这里插入图片描述

1.1.1解决CPU及内存压力和IO压力:

在这里插入图片描述

1.2NoSQL简单概述

1.2.1NoSQL数据库概述
  1. 不支持SQL标准
  2. 不支持ACID。即事务的四大特性原子性、一致性、隔离性、持久性
  3. 远超SQL的性能
1.2.2NoSQL使用场景
  1. 对数据高并发的读写(电商里的秒杀场景)
  2. 海量数据的读写
  3. 对数据的高扩展性
1.2.3NoSQL不适用场景
  1. 需要事务的支持
  2. 基于SQL的结构化查询存储,处理复杂的关系。
1.2.4有哪些NoSQL数据库
  1. Memcache(缺点不支持数据的持久化,数据不能存储到硬盘中)
  2. Redis (支持数据的持久化、支持多种数据结构list\set\hash\zset)
  3. mongoDB(文档型数据库、存储的数据类型更加的多样化)

1.3行列式存储数据库(大数据时代)

在这里插入图片描述

2、Redis安装

2.1使用宝塔傻瓜式安装

2.2Redis启动

在这里插入图片描述

  1. ps -ef | grep redis //查看redis启动后的进程
  2. reids-server redis.conf //启动redis服务
  3. redis-cli //设置可以用客户端终端访问
  4. auth 123456 //输入密码
  5. 127.0.0.1:6379> ping //测试验证一下

2.3Redis关闭

  1. 第一:用宝塔关闭(简单)
  2. 第二:单实例关闭:redis-cli shutdown
  3. 第三:可以进入终端后关闭

在这里插入图片描述

  1. 第四:知道redis进程号后用kill命令杀掉redis进程

3、Redis相关知识介绍

3.1Redis是单线程+多路IO复用技术(可以实现多线程的效果)

  1. 如下图描述:单线程+多路IO复用
    在这里插入图片描述
  2. Redis读取是原子操作,因为在黄牛和售票厅之间是单线程的,不像多线程里面需要加锁

3.2Redis中常用5大基本数据类型

(1)Redis键(key)
  1. keys * :查看当前库中的所有key
  2. set :设置key-value
  3. exists key1 :判断key1是否存在——返回1:存在,2:不存在
  4. type key2 :查看key2所对应值的类型
  5. del key2 :删除key2
  6. unlink key2 :删除key2(它会先返回消息说已经删掉了key2,其实还没有删除,真正的删除是在以后慢慢删除,异步删除)
  7. expire key1 10 :设置过期时间,为key1设置10秒后过期
  8. ttl key1:查看key1是否已经过期——返回: -1:永不过期,-2:已经过期
  9. select :切换库(Redis一共有16个库,默认用0号库)
  10. dbsize :查看当前数据库的key的数量
  11. flushdb:清空当前库
  12. flushall :通杀全部库
(2)字符串String
  1. String类型是二进制安全的。意味着Redis的String可任意包含任何数据。比如jpg图片,或者序列化对象,通俗点,只要你的内容能用字符串表示,我们都能存到Redis去。
  2. String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以达到512MB。
  3. 关于String的命令:
  1. set:添加key—value (设置相同key的数据会把前面的覆盖掉)
  2. get:取值
  3. append:将指定的value追加到原来值的末尾
    在这里插入图片描述
  4. strlen:获取指定值的长度;
  5. setnx:当库中没有对应的key时,设置key-value才能成功。(以防覆盖原来的);
  6. incr key:将key中存储的数值加1,如果为空,则新增值1;
  7. decr key:将key中存储的数值减1;
  8. incrby/decrby key 步长:给数值加减指定的数。
  9. mset :同时设置多个key-value(不保证原子性)
  10. mget :同时获取多个key分别对应的值(不保证原子性)
  11. msetnx:同时设置多个key-value,但是key不能和之前有重复,如果有一个重复则这次设置的key-value都失败;(体现原子性
  12. getrange key 起始位置 结束位置:获取key对应值的
  13. setrange key 起始位置 value : 用value覆盖掉从起始位置开始的值
    在这里插入图片描述
  14. setex key 过期时间 value 设置key-value时设置过期时间;
  15. getset key1 value:设置新的key1-value;同时输出原来的key1对应的value
    在这里插入图片描述
  1. String的数据结构
  1. String的内部结构为简单的动态字符串(Simple Dynamic String),是可以修改的字符串(Java的字符串是不可变的),其内部结构类似于Java中的ArrayList,可以伸缩。

在这里插入图片描述

(3)列表(List)
  1. List是简单的字符串列表,里面存储的都是一个一个的字符串;
  2. List底层实现为一个循环的双向链表,对两端的操作时它性能很高,当需要通过下标操作中间件时性能较差。
  3. 常用命令:
  1. lpush/rpush key value1 value2 value3:从左/右边边放入多个值;
    在这里插入图片描述
  2. lrange key1 start stop: 按照索引下标获取元素(从左到右)
    如:lrange key1 0 -1: 从左到右取出所有元素,0代表第一个位置,因为是链表List底层是双向链表,所以-1代表左后一个位置。
  3. lpop/rpop key count: 从key对应的链表的左边或者从右边取出count个值; 每取出一个值该链表少一个值;
  4. rpoplpush key1 key2 :把key1最右边的一个value放到key2最左边去。
    在这里插入图片描述
  5. lindex key index :按照索引下标获得元素;
  6. linsert key before value newvalue: 在旧的值的后面插入一个新的值;
  7. lrem key N value11:从左边到右边删除N个一样的value;
  8. lset key index value :将key对应列表中下标为index的值替换为value
  1. List列表数据结构:
  1. List会在数据量较少时寻找一块连续的空间,结构为zipList.也就是压缩列表。只有数据量比较多时才会改成多个zipList首尾相连的quickList(链表实现)
    在这里插入图片描述
  2. 使用普通链表,如果存放的只是int型数据,还需要在两边加上指针(prev,next),极大浪费空间。
(4)集合(Set)
  1. Redis Set和List的功能不同在于List可以有重复项,而Set没有重复项。Set可以自动排重
  2. Redis Set集合内提供了查看一个成员是否在Set中的接口,而List当中就没有这样的就功能。
  3. Redis Set是String类型的无序集合,底层就是一个值为null的hash表,所以添加删除查找复杂度都是O(1).
  4. 常用命令:

在这里插入图片描述

在这里插入图片描述

  1. Redis Set数据结构:
  1. Set数据结构是dict字典,字典就是哈希表实现;
  2. Java中HashSet就用HashMap实现,只不过所有的value指向同一个对象。
  3. Redis的set结构也是一样,它内部也使用hash结构,所有的value都指向同一个内部的值。
(5)哈希(hash)
  1. Redis hash的由来:Redis hash是一张String类型的field和value的映射表,hash特别适合存储对象,类似于Java中的Map<String,Object>.

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  1. hash常用命令:
    在这里插入图片描述
  2. hash数据结构:

hash类型对应的数据类型是2种:zipList(压缩列表),hashTable(哈希表)。当field-value长度较短并且个数较少时,使用zipList,否则使用hashTable。

(6)有序集合(ZSet)
  1. 简介:Redis有序集合Zset与普通集合Set很类似,没有一个重复元素的字符串集合。
  2. 不同之处在于Zset的每个成员有关联一个评分,该评分(score),集合中的成员按照自己关联的评分高低排先后顺序。集合成员是唯一的,但是成员关联的评分可以相同。
  3. Zset的元素是有序的,而且没有重复项。
  4. 常用命令:
    在这里插入图片描述
    在这里插入图片描述
  5. 案例:利用Zset实现一个文章访问量排行榜。

在这里插入图片描述

  1. Zset数据结构:
  1. Zset数据结构很特殊,一方面,value内部等价于Java中的Map<String,Double>
    在这里插入图片描述
  2. 另一方面,类似于TreeSet,内部的元素会按照权重score来排名,还可以用过score范围来获取范围内的元素。
  3. Zset底层使用了两个数据结构
    (1)hash,hash的作用是的作用是关联元素的值与score,保证元素的唯一性,可任通过value找到相应的score值。
    (2)跳跃表(跳表),跳跃表的目的:在于给元素value排序,根据score来查找元素。
    在这里插入图片描述
    例如:在这里插入图片描述

4、Redis配置文件讲解

4.1

5、Redis的发布和订阅

5.1什么时发布和订阅?

  1. Redis发布和订阅是一种通信模式:发送者发送消息,订阅者接收消息
  2. Redis客户端可以订阅任意数量的频道。
    在这里插入图片描述

5.2Redis的发布与订阅。

在这里插入图片描述

5.3发布与订阅的命令实现。

  1. 打开一台客户端订阅频道1、2;
  1. SUBSCRIBE channel1 chanel2————订阅频道1 和频道2
  1. 打开另一台客户端分别向频道1和频道2发送“nihao”;
  1. publish channel1 nihao ————向频道1发送“nihao”
  2. publish channel2 nihao————向频道2发送“nihao”

6. Redis新数据类型

6.1Bitmaps:新数据类型

(1)Redis提供了Bitmaps这个数据类型可以实现对位操作

  1. Bitmaps本身不是数据类型,实际上它就是字符串(相当于字符类型和字符串的差别)。
  2. Bitmaps可以被想象成一个以bit(位)为单位的数组(这个数组中只能存“0”或者“1”,如果存默认数组里面全是0),数组的下标叫做偏移量(offset)
  3. 基本命令:
  1. setbit key offset value :往一个key对应的数组(以位为单位的数组)中的offset(偏移量)的这个位置存一个值,value值只能为“0”或“1”;
  2. getbit key offset:取出该offset(偏移量)对应的值
  3. bitcount key :统计key对应的Bitmaps中为“1”的个数。
  4. bitcount key start end bit :以bit为单位在start和end中有多少个“1”;
  5. bitcount key start end byte :以byte为单位在start和end中有多少个“1”;
    在这里插入图片描述
  6. bitop and(or/not/xor) destkey key[key…],对多个Bitmaps求,and(交集)、or(并集)、not(非)、xor(异或)操作,并将结果保存在目标Bitmaps(deskey)中。
  1. 举例1:一个班的有10位同学,学号分别为1 2 3 4 5 6 7 8 9 10,如果他们看了青年大学习就用”1”表示,如果没看就用“0”表示;把他们的学号作为offset(偏移量),value就是“0”或者“1”;

在这里插入图片描述

  1. 举例2:统计一个有1亿用户数量的网站的某一天的活跃用户数量,若1亿用户里有5000万用户活跃。

方案一:用集合Set存储活跃用户的id,每个人的id占64位,那么存储id总共花费:64bit x 5000万=32亿bit
方案二:用Bitmaps记录每一位用户是否活跃,那么花费:1bit x 1亿=1亿bit
结论:很明显当活跃用户多时,方案二很好;但是活跃用户少时,方案一好;

  1. Bitmaps用来表示一个团体的人做一件事,哪些人做了,哪些人没做很合适(或者像统计一个网站的活跃用户有哪些)。比如一个班看青年大学习,有一部分同学看了,一部分同学还没看,怎么记录看了的同学?就把看了的同学的学号作为偏移量或者数组下标,以1作为value存到Bitmaps中。

6.2HyperLogLog:新数据类型

  1. 主要用来解决基数运算。什么是基数?就是像一个集合中去了重复项之后的总的个数。
  2. 如:统计一个网站今天有多少个ip地址访问过。

解决像这样的问题有很多种解决方案:

  1. 方案一:如果数据存储在Mysql中,使用distinct count统计不重复的值;
  2. 方案二:使用Redis中的hash、set、bitmaps、这些结构都能处理
  3. 为什么不用这些结构:因为以上数据结构如果对于大的数据集,将要浪费大量空间,不切实际。
  4. 方案三:使用hyperLogLog来统计
  1. HyperLogLog是用来统计基数的算法。
  2. 优点:HyperLogLog计算基数所需的空间是固定大小的,并且很小。
  3. HyperLogLog算法,不像Zset、hash这些数据结构内部的算法,后者在统计量很大的数据集时占用空间也会很大,不划算。
  4. HyperLogLog只会根据输入的元素计算出基数,而不会像Zset、hash存储元素。
  5. 基本命令:
  1. pfadd key value[values]:把value添加,并不是存储起来,而是用来计算基数
  2. pfcount key :计算基数;

6.3Geospatial

Geo:Geographic:地理学的
spatial:空间的

  1. Redis3.2增加了地理信息类型的支持,该类型的元素就是二维坐标。经度和纬度。(经度范围:-180_180;维度范围:-85_85)
  2. 基本命令:
  1. 添加多个个地点
    在这里插入图片描述
  2. geopos key shanghai:取一个地点的经纬度:
    在这里插入图片描述
  3. geodist key member1 member2 [m米/km千米/ft英尺/mi英里]:得到两个地点之间的直线距离
  4. georadius key 经度 维度 半径 [m/km/ft/mi] 以一个经纬度为中心,得到周围半径以内的距离的地点有哪些。

7、 jedis连接Redis

8、Redis_jedis实例

8.1做一个手机验证码功能:

简介:

  1. 生成随机6位数验证码,把这个验证码存在Redis中,然后再把这个数发送个用户;
  2. 生成的验证码2分钟失效,并且一天内只能生成3次验证码。
  3. 用户输入收到的验证码,并且输入
  4. 把用户输入的验证码与Redis中调出的验证码做等价判断。
package com.yiheng.jedis;

import redis.clients.jedis.Jedis;

import java.util.Random;
import java.util.Scanner;

//案例需求:
//输入手机号之后,我们点击一下,能够获取随机6位的验证码。
public class PhoneCode {
   

    public static void main(String[] args) {
   
        //1、用户点击获取验证码后:向Redis保存生成的验证码,并且向用户发送该验证码;
        int i = verifyCode("18728089510");

        if(i==1){
   //达到了获取3次的界限
            System.out.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值