Redis入门(二)
发布日期:2022-03-04 11:48:22 浏览次数:3 分类:技术文章

本文共 8911 字,大约阅读时间需要 29 分钟。

目录


第四章 Redis配置文件介绍

   redis.conf文件。

4.1 Units单位

   配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit。对大小写不敏感。

4.2 INCLUDES包含

   类似jsp中的includes,多实例的情况可以把公用的配置文件提取出来。

4.3 NETWORK网络相关配置

4.3.1 bind和protected-mode

   bind指的是绑定部署redis服务机器的网卡ip,比如一台机器对外暴露了多个ip,ip1、ip2、ip3,通过ip1,ip2,ip3都可以访问这台机器,也就是通过ip1,ip2,ip3都可以连接到redis服务,但是设置了bind参数后,比如bind=ip1,此时只能通过ip1访问redis服务,ip2,ip3不行,虽然ip2,ip3可以访问部署redis的机器,但是却不能访问此机器上的redis服务。

   默认情况bind=127.0.0.1,表示只能接受本机的访问请求。

   不写的情况下,无限制接受任何ip地址的访问。生产环境肯定需要写应用服务器的地址,服务器是需要远程访问的,因此需要将其注释掉

   如果开启了protected-mode(本机访问保护模式),那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的相应。因此还需要把protected-mode设置为no

4.3.2 Port

   端口号,默认6379

4.3.3 tcp-backlog

   设置tcp的backlog,backlog是一个连接队列

        backlog队列总和 = 未完成三次握手队列 + 已经完成三次握手队列

   在高并发的情况下需要一个高backlog值来避免慢客户端连接问题。

   注意Linux内核会将这个值减小到/proc/sys/net/core/somaxconn的值(128),所以需要确认增大/proc/sys/net/core/somaxconn和/proc/sys/net/ipv4/tcp_max_syn_backlog(128)两个值来达到想要的效果。

4.3.5 timeout

   一个空闲的客户端维持多少秒会关闭。0表示关闭该功能,即永不关闭。

4.3.6 tcp-keepalive

   对访问客户端的一种心跳检测,每隔n秒检测一次。单位为秒,如果设置为0,则不会进行keepalive检测,建议设置成60。

4.4 GENERAL通用

4.4.1 daemonize

   是否为后台进程,设置为yes。守护进程,后台启动。

4.4.2 pidfile

   存放pid文件的位置,每个实例会产生一个不同的pid文件。

4.4.3 loglevel

   指定日志级别,Redis总共支持四个级别

        ①debug

        ②verbose

        ③notice(默认)

        ④warning

   四个级别根据使用阶段来选择,生产环境选择notice或者warning。

4.4.4 logfile

   日志文件名称。

4.4.5 databases

   设定数据库的数量,默认为16。默认使用的数据库为0。可以使用select <dbid>命令在连接上指定数据库id。

4.5 SECURITY安全

4.5.1 requirepass

   参考:

   访问密码的查看、设置和取消。

   注意:在命令行中设置密码,只是临时的,重启过redis服务器,密码就还原了。要想永久设置,还是需要在配置文件中进行设置。

4.6 CLIENTS

4.6.1 maxclients

  • 设置redis同时可以与多少个客户端进行连接。
  • 默认情况下为10000个客户端。
  • 如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出"max number of clients"以作回应。

4.7 MEMORY MANAGEMENT

4.7.1 maxmemory

  • 建议必须设置,否则,将内存占满,造成服务器宕机。
  • 设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指导。
  • 如果redis无法根据移除规则来移除内存中的数据,或者设置了"不允许移除",那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等;但是对于无内存申请的指令,仍然会正常响应,比如GET等。
  • 如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素。

 4.7.2 maxmemory-policy

  • volatile-lru:使用LRU(最近最少使用算法)移除key,只对设置了过期时间的键。
  • allkeys-lru:在所有集合key中,使用LRU算法移除key。
  • volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键。
  • allkeys-random:在所有集合key中,移除随机的key。
  • volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key。
  • noeviction:不进行移除。针对写操作,只是返回错误信息。

4.7.3 maxmemory-samples

  • 设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个。
  • 一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小。

第五章 Redis的发布和订阅

5.1 什么是发布和订阅

   Redis发布/订阅(pub/sub)是一种消息通信模式:发送者pub发送消息,订阅者sub接收消息。

   Redis客户端可以订阅任意数量的频道。

5.2 Redis的发布和订阅

   客户端可以订阅频道如下图:

   当给这个频道发布消息后,消息就会发送给订阅的客户端:

5.3 发布订阅命令行实现

   1.打开一个客户端订阅channel1:

   2.打开另一个客户端,给channel发布消息hell:其中返回的1是订阅者数量。

   3.打开第一个客户端可以看到发生的消息:

   注意:发布的消息没有持久化,如果再订阅的客户端收不到hello,只能受到订阅后发布的消息。

第六章 Redis新数据类型

6.1 Bitmaps

6.1.1 简介

   现代计算机用二进制(位)作为信息的基础单位,1个字节等于8位,例如"abc"字符串是由3个字节组成,但实际在计算机存储时将其用二进制表示,"abc"分别对应的ASCII码分别是97、98、99,对应的二进制分别是01100001、01100010和01100011,如下图:

   合理地使用操作位能够有效地提高内存使用率和开发效率。

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

        ①Bitmaps本身不是一种数据类型, 实际上它就是字符串(key-value) , 但是它可以对字符

          串的位进行操作。

        ②Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。

          可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标

          在Bitmaps中叫做偏移量

6.1.2 命令

   1.setbit <key> <offset> <value>:设置Bitmaps中某个偏移量的值(0或1)。offset偏移量从0开始

        注意:在第一次初始化Bitmaps时,假如偏移量非常大,那么整个初始化过程执行会比较慢,

      可能会造成Redis的阻塞。

   2.getbit <key> <offset>:获取Bitmaps中某个偏移量的值。

   3.bitcount <key> [start end]:统计字符串从start字节到end字节比特值为1的数量。

        统计字符串被设置为1的bit数。一般情况下,给定的整个字符串都会被进行计数,通过指定额

      外的start或end参数,可以让计数只在特定的位上进行。start和end参数的设置,都可以使用负

      数值:比如-1表示最后一个位,而-2表示倒数第二个位,start、end是指bit组的字节的下标

      数(起始和结束字节数),二者皆包含

        注意:setbit设置或清除的时bit(位)位置,二bitcount计算是byte(字节)位置。

   4.bitop  and(or/not/xor) <destkey> [key…]:bitop是一个复合操作,它可以做多个Bitmaps的and(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存在destkey中。

6.2 HyperLogLog

6.2.1 简介

   在工作当中,我们经常会遇到与统计相关的功能需求,比如统计网站PV(PageView页面访问量),可以使用Redis的incr、incrby轻松实现。

   但像UV(UniqueVisitor,独立访客)、独立IP数、搜索记录数等需要去重和计数的问题如何解决?

        这种求集合中不重复元素个数的问题称为基数问题

   解决基数问题有很多种方案:

        ①数据存储在MySQL表中,使用distinct count计算不重复个数。

        ②使用Redis提供的hash、set、bitmaps等数据结构来处理。

        以上的方案结果精确,但随着数据不断增加,导致占用空间越来越大,对于非常大的数据集

      是不切实际的。

   能否能够降低一定的精度来平衡存储空间?

        Redis推出了HyperLogLog。

   HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。在Redis里面,每个HyperLogLog键只需要花费12 KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。

6.2.2 命令

   1.pfadd <key> < element> [element ...]:添加指定元素到HyperLogLog中。将所有元素添加到指定HyperLogLog数据结构中。如果执行命令后HLL估计的近似基数发生变化,则返回1,否则返回0。

   2.pfcount <key> [key ...]:计算HLL的近似基数,可以计算多个HLL。比如用HLL存储每天的UV,计算一周的UV可以使用7天的HLL合并计算即可。

   3.pfmerge <destkey> <sourcekey> [sourcekey ...]:将一个或多个HLL合并后的结果存储在另一个HLL中,比如每月活跃用户可以使用每天的活跃用户来合并计算可得。

6.3 Geospatial

6.3.1 简介

   Redis 3.2中增加了对GEO类型的支持。GEO(Geographic),地理信息的缩写。该类型就是元素的二维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度Hash等常见操作。

6.3.2 命令

   1.geoadd <key> < longitude> <latitude> <member> [longitude latitude member...]:添加地理位置(经度,纬度,名称)。

        南北两极无法直接添加,一般会下载城市数据,直接通过 Java 程序一次性导入。

        有效的经度从-180度到180度。有效的纬度从-85.05112878度到85.05112878度。

        当坐标位置超出指定范围时,该命令将会返回一个错误。

        已经添加的数据,是无法再次往里面添加的。

   2.geopos  <key> <member> [member...]:获得指定地区的坐标值。

   3.geodist <key> <member1> <member2>  [m|km|ft|mi ]:获取两个位置之间的直线距离。

        m 表示单位为米[默认值]。

        km 表示单位为千米。

        mi 表示单位为英里。

        ft 表示单位为英尺。

   4.georadius <key> < longitude> <latitude> radius m|km|ft|mi:以给定的经纬度为中心,找出某一半径内的元素。

第七章 Jedis测试

7.1 Jedis的依赖

<dependency>

        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.2.0</version>
</dependency>

7.2 Jedis的测试程序

package com.xxy.jedis;import redis.clients.jedis.Jedis;public class JedisDemo1 {    public static void main(String[] args) {        //创建Jedis对象        //IP地址,端口号        Jedis jedis = new Jedis("192.168.128.100",6379);        jedis.auth("******");//输入redis登录密码        //测试        String value = jedis.ping();        System.out.println(value);    }}

   如果连不通,解决方法:

        1.查看redis.conf中是否把bind 127.0.0.1注释掉,是否把protected-mode设置为no。

        2.禁用Linux的防火墙:

7.3 数据类型的相关操作示例

7.3.1 关于key的操作

jedis.set("k1", "v1");jedis.set("k2", "v2");jedis.set("k3", "v3");Set
keys = jedis.keys("*");System.out.println(keys.size());for (String key : keys) {System.out.println(key);}System.out.println(jedis.exists("k1"));System.out.println(jedis.ttl("k1")); System.out.println(jedis.get("k1"));

7.3.2 关于String的操作

jedis.mset("str1","v1","str2","v2","str3","v3");System.out.println(jedis.mget("str1","str2","str3"));

7.3.3 关于List的操作

List
list = jedis.lrange("mylist",0,-1);for (String element : list) {System.out.println(element);}

7.3.4 关于Set的操作

jedis.sadd("orders", "order01");jedis.sadd("orders", "order02");jedis.sadd("orders", "order03");jedis.sadd("orders", "order04");Set
smembers = jedis.smembers("orders");for (String order : smembers) { System.out.println(order);}jedis.srem("orders", "order02");

7.3.5 关于Hash的操作

jedis.hset("hash1","userName","lisi");System.out.println(jedis.hget("hash1","userName"));Map
map = new HashMap
();map.put("telphone","13810169999");map.put("address","atguigu");map.put("email","abc@163.com");jedis.hmset("hash2",map);List
result = jedis.hmget("hash2", "telphone","email");for (String element : result) { System.out.println(element);}

7.3.6 关于ZSet的操作

jedis.zadd("zset01", 100d, "z3");jedis.zadd("zset01", 90d, "l4");jedis.zadd("zset01", 80d, "w5");jedis.zadd("zset01", 70d, "z6"); Set
zrange = jedis.zrange("zset01", 0, -1);for (String e : zrange) {System.out.println(e);}

7.4 Jedis简单实例

7.4.1 完成一个手机验证码功能

   要求:

        1.输入手机号,点击发送后随机生成6位数字码,2分钟内有效。

        2.输入验证码,点击验证,返回成功或失败。

        3.每个手机号每天只能输入3次。

   生成6位数验证码的代码:

public static String getCode() {    Random random = new Random();    StringBuilder code = new StringBuilder();    for (int i = 0;i < 6;i++) {        int rand = random.nextInt(10);        code.append(rand);    }    return code.toString();}

   每个手机每天只能发送三次,把验证码放到redis中,设置过期时间:

public static void verifyCode(String phone) {    //连接redis    Jedis jedis = new Jedis("192.168.128.100",6379);    jedis.auth("neymarXLS980910.");    //拼接key    //手机发送次数key    String countKey = "VerifyCode" + phone + ":count";    //验证码key    String codeKey = "VerifyCode" + phone + ":code";    //每个手机每天只能发送三次    String count = jedis.get(countKey);    if (count == null) {        //说明没有发送过,第一次发送        //设置发送次数为1        //过期时间为1天        jedis.setex(countKey,24 * 60 * 60,"1");    } else if (Integer.parseInt(count) <= 2) {//说明还没有发送3次        jedis.incr(countKey);//更新次数,加1    } else {//当天发送次数达到了3次        //不能再发送了        System.out.println("今天发送次数已经达到上限3次,不能再发送了");        jedis.close();//不能再发送了,关闭连接        return;//次数达到3次,就不能再发了,后面的验证码操作不执行    }    //发送验证码放到redis中    String vcode = getCode();    jedis.setex(codeKey,120,vcode);//有效时间两分钟    jedis.close();}

   验证码校验:

public static void getRedisCode(String phone,String code) {    //连接redis    Jedis jedis = new Jedis("192.168.128.100",6379);    jedis.auth("neymarXLS980910.");        String codeKey = "VerifyCode" + phone + ":code";    String redisCode = jedis.get(codeKey);    //判断    if (redisCode.equals(code)) {        System.out.println("成功");    } else {        System.out.println("失败");    }}

PS:根据尚硅谷课程整理,如有侵权,联系删除

转载地址:https://blog.csdn.net/xxyneymar/article/details/122408761 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:力扣题739每日温度
下一篇:力扣题844比较含退格的字符串

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月06日 06时24分32秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

站在2018看单片机和嵌入式芯片方案选型和发展趋势 2019-04-25
Linux内核编程初探:块设备驱动程序——Ramdisk 2019-04-25
C语言 memcpy 用法 2019-04-25
浅论各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别 2019-04-25
C++深度解析 内联函数分析 内联inline和宏#define(5) 2019-04-25
C++深度解析 函数参数的扩展---函数参数的默认值,函数默认参数的规则,函数占位参数(6) 2019-04-25
C++深度解析 函数重载分析(7) 2019-04-25
报表的 SQL 注入风险是什么意思?如何防范? 2019-04-25
JS-part3.3-复杂数据类型之 数组和排序方法 2019-04-25
【Python自学笔记】新手爬虫必备!!scrapy2.5.0重新整理(更新中...) 2019-04-25
【Python自学笔记】MySql数据库,MySql8存储json数据(含安装&基本使用&Scrapy保存数据) 2019-04-25
【Kivy自学笔记】Python开发App必备!Kivy基础控件详解(含视频&源码) 2019-04-25
【Python自学笔记】新手爬虫必备!Scrapy快速下载图片&文件,如何自定义文件名(源码) 2019-04-25
【Python自学笔记】新手爬虫必备!Scrapy如何使用Selector快速提取HTML页面数据(CSS/Xpath/re正则) 2019-04-25
求和与平均值 2019-04-25
if选择结构 2019-04-25
switch多选择结构 2019-04-25
计算1+2+3+...+100 2019-04-25
用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个 2019-04-25
学习的总结 2019-04-25