锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

redis

时间:2023-05-01 04:37:00 km02h1重量变送器z6综合变送器频率变送器sk3351压力变送器

一.安装redis

1、安装 C 语言编译环境

yum install centos-release-scl scl-utils-build yum install -y devtoolset-8-toolchain scl enable devtoolset-8 bash  

2、通过 wget 下载

wget https://download.redis.io/releases/redis-6.2.6.tar.gz  // 下载路径:/opt  

3.解压至当前目录

tar -zxvf redis-6.2.6.tar.gz  

4.解压后进入目录

cd redis-6.2.6 

5.在当前目录录 make

make && make install 

默认安装在 /usr/local/bin
在这里插入图片描述redis-benchmark:性能测试工具可以在自己的书中运行,看看自己的书的性能
redis-check-aof:修理有问题AOF文件,rdb和aof后面讲
redis-check-dump:修理有问题dump.rdb文件
redis-sentinel:Redis集群使用
redis-server:Redis服务器启动命令
redis-cli:客户端,操作入口

前台启动:***/usr/local/bin*** 目录下启动 redis

redis-server(前台启动)  

后台启动:

  • 安装 redis 的目录 /opt/redis-6.2.6 中将 redis.conf 复制到任何文件夹
cp redis.conf /etc/redis.conf // 将redis.conf复制到/etc/下  

-修改 /etc/redis.conf 配置文件

vim redis.conf# daemonize no 修改为 daemonize yes  
  • /usr/local/bin 目录下启动 redis
redis-server /etc/redis.conf 
  • 关闭 redis
    kill 进程
    命令 shutdown

二、redis相关知识


单线程 多路IO复用
默认端口号:6379
2.1、 key的操作

  • keys * 查看当前库的所有权key
  • set key value 设置key值与value
  • exists key 判断key是否存在
  • type key 查看key是什么类型
  • del key 删除指定的key数据
  • unlink key 根据value选择非阻塞删除
  • expire key 10 10秒钟:为给定的key设置过期时间
  • ttl key 检查还有多少秒过期,-1表示永远不会过期,-2表示已过期

2.2.库的选择:

  • select 命令切换数据库
  • dbsize 查看当前数据库key数量
  • flushdb 清空当前库
  • flushall 通杀全部库

2.3、string字符串

  • 一个key对应一个value
  • 安全的二进制可以包含任何数据
  • value最多可以是512m

参数设置:

  • set key value 设置key值
  • get key 查询key值
  • append key value 将给定的value追加到原值的末尾
  • strlen key 获取值的长度
  • setnx key value 只有在key当不存在时,设置key值
  • incr key 将key存储值的数字增加1,只操作数字值,如果空,新增值为1
  • decr key 将key存储值的数字减1,只操作数字值,如果为空,新增值为1
  • incrby/decrby key <步长> 将key存储值的数字增减如步长

补充:
原子操作
从头到尾都不会被打断。
单线程不会被打断

补充额外的字符串参数:

  • mset key value key value…同时设置一个或多个key-value
  • mget key key…同时获得一个或多个value
  • msetnx key value key value…同时设置一个或多个key-value.仅当所有给定key都不存在
  • getrange key <起始位置> <结束位置> 获取key起始位置和结束位置的值
  • setrange key <起始位置> value 将value值覆盖的开始位置
  • setex key <> vale 设置键值的同时,设置过期时间
  • getset key value 用新值换旧值

2.4、list列表(quickList)

  • lpush/rpush key value value…从左或者右插入一个或者多个值(头插与尾插)
  • lpop/rpop key 从左或者右吐出一个或者多个值(值在键在,值都没,键都没)
  • rpoplpush key1 key2 从key1列表右边吐出一个值,插入到key2的左边
  • lrange key start stop 按照索引下标获取元素(从左到右)
  • lrange key 0 -1 获取所有值
  • lindex key index 按照索引下标获得元素
  • llen key 获取列表长度
  • linsert key before/after value newvalue 在value的前面插入一个新值
  • lrem key n value 从左边删除n个value值
  • lset key index value 在列表key中的下标index中修改值value

2.5、set集合
字典,哈希表
自动排重且为无序的
常用命令:

  • sadd key value value… 将一个或者多个member元素加入集合key中,已经存在的member元素被忽略
  • smembers key 取出该集合的所有值
  • sismember key value 判断该集合key是否含有该值
  • scard key 返回该集合的元素个数
  • srem key value value 删除集合中的某个元素
  • spop key 随机从集合中取出一个元素
  • srandmember key n 随即从该集合中取出n个值,不会从集合中删除
  • smove <一个集合a><一个集合b>value 将一个集合a的某个value移动到另一个集合b
  • sinter key1 key2 返回两个集合的交集元素
  • sunion key1 key2 返回两个集合的并集元素
  • sdiff key1 key2 返回两个集合的差集元素(key1有的,key2没有)

2.6、hash哈希
数据结构:当field-value长度较短且个数较少时,使用ziplist(压缩列表),否则使用hashtable
键值对集合,特别适合用于存储对象类型
常用命令:

  • hset key field value 给key集合中的filed键赋值value
  • hget key1 field 集合field取出value
  • hmset key1 field1 value1 field2 value2 批量设置hash的值
  • hexists key1 field 查看哈希表key中,给定域field是否存在
  • hkeys key 列出该hash集合的所有field
  • hvals key 列出该hash集合的所有value
  • hincrby key field increment 为哈希表key中的域field的值加上增量1 -1
  • hsetnx key field value 将哈希表key中的域field的值设置为value,当且仅当域field不存在

2.7、zset
数据结构:map+跳跃表
没有重复元素的字符串集合,按照相关的分数进行排名,排名从低到高,排名可重复

有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合

常用命令:

  • zadd key score1 value1 score2 value2 将一个或多个member元素及其score值加入到有序key中
  • zrange key start stop (withscores) 返回有序集key,下标在start与stop之间的元素,带withscores,可以让分数一起和值返回到结果集。
  • zrangebyscore key min max(withscores) 返回有序集key,所有score值介于min和max之间(包括等于min或max)的成员。有序集成员按score的值递增次序排列
  • zrevrangebyscore key max min (withscores)同上,改为从大到小排列
  • zincrby key increment value 为元素的score加上增量
  • zrem key value 删除该集合下,指定值的元素
  • zcount key min max 统计该集合,分数区间内的元素个数
  • zrank key value 返回该值在集合中的排名,从0开始

三、配置文件


redis.conf
3.1、Units

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

大小写不敏感。

3.2、INCLUDES
包含,多实例的情况可以把公用的配置文件提取出来。

3.3、NETWORK
网络相关配置。

bind

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

不写的情况下,无限制接受任何 ip 地址的访问。

生产环境肯定要写你应用服务器的地址,服务器是需要远程访问的,所以需要将其注释掉

如果开启了protected-mode,那么在没有设定 bind ip 且没有设密码的情况下,Redis 只允许接受本机的响应。
protected-mode

将本机访问保护模式设置 no。
port

端口号,默认 6379。
tcp-backlog

设置 tcp 的 backlog,backlog 其实是一个连接队列,backlog 队列总和 = = = 未完成三次握手队列 + + + 已经完成三次握手队列。

在高并发环境下你需要一个高 backlog 值来避免慢客户端连接问题。
timeout

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

对访问客户端的一种心跳检测,每个 n 秒检测一次。

单位为秒,如果设置为 0,则不会进行 Keepalive 检测,建议设置成 60。
pidfile

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

指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默认为 notice。
3.4、SECURITY

安全。

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

在命令中设置密码,只是临时的。重启 redis 服务器,密码就还原了。

永久设置,需要在配置文件中进行设置。

3.5、LIMITS
限制。

maxclients

设置 redis 同时可以与多少个客户端进行连接。

默认情况下为 10000 个客户端。

如果达到了此限制,redis 则会拒绝新的连接请求,并且向这些连接请求方发出 max number of clients reached 以作回应。

maxmemory

建议必须设置,否则,将内存占满,造成服务器宕机。

设置 redis 可以使用的内存量。一旦到达内存使用上限,redis 将会试图移除内部数据,移除规则可以通过 maxmemory-policy 来指定。

如果 redis 无法根据移除规则来移除内存中的数据,或者设置了不允许移除,那么 redis 则会针对那些需要申请内存的指令返回错误信息,比如 SET、LPUSH 等。

maxmemory-policy

volatile-lru:使用 LRU 算法移除 key,只对设置了过期时间的键(最近最少使用)。

allkeys-lru:在所有集合 key 中,使用 LRU 算法移除 key。

volatile-random:在过期集合中移除随机的 key,只对设置了过期时间的键。

allkeys-random:在所有集合 key 中,移除随机的 key。

volatile-ttl:移除那些 TTL 值最小的 key,即那些最近要过期的 key。

noeviction:不进行移除。针对写操作,只是返回错误信息。

四、发布订阅


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

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

1、 客户端可以订阅频道
2、当给这个频道发布消息后,消息就会发送给订阅的客户端
subscribe channel # 订阅频道

publish channel hello # 频道发送信息

新数据类型
Bitmaps
1.合理使用操作位可以有效地提高内存使用率和开发使用率
2.本身是一个字符串,不是数据类型,数组的每个单元只能存放0和1,数组的下标在Bitmaps叫做偏移量
3.节省空间,一般存储活跃用户比较多

命令参数:
1.设置值

setbit key offset value

第一次初始化bitmaps,如果偏移量比较大,那么整个初始化过程执行会比较慢,还可能会造成redis的堵塞

2.getbit取值

getbit key offset 

3.bitcount 统计数值

bitcount key (start end)

redis的setbit设置或清除的是bit位置,而bitcount计算的是byte的位置

4.bitop
复合操作,交并非异或,结果保存在destkey

bitop and(or/not/xor)destkey key

HyperLogLog
1.统计网页中页面访问量
2.只会根据输入元素来计算基数,而不会储存输入元素本身,不能像集合那样,返回输入的各个元素
3.基数估计是在误差可接受的范围内,快速计算(不重复元素的结算)

命令参数:
1.添加指定的元素到hyperloglog中

pfadd key element

列如 pfadd progame “java”
成功则返回1,不成功返回0

2.计算key的近似基数

pfcount key 

即这个key的键位添加了多少个不重复元素

3.一个或多个key合并后的结果存在另一个key

pfmerge destkey sourcekey sourcekey

Geographic
提供经纬度设置,查询范围,距离查询等

命令参数:
1.添加地理位置(经度纬度名称)
当坐标超出指定的范围,命令会返回一个错误
已经添加的数据,无法再添加

geoadd key longitude latitude member

例如 geoadd china:city 121.47 31.23 shanghai

2.获取指定地区的坐标值

geopos key member 

例如 geopos china:city shanghai

3.获取两个位置之间的直线距离

geodist key member1 member2 (m km ft mi)

4.以给定的经纬度为中心,找出某一半径的内元素

georadius key longitude latitude radius (m km ft mi)

五、Jedis操作Redis


即 Java 操作 Redis。
1、依赖

<dependency>
  <groupId>redis.clientsgroupId>
  <artifactId>jedisartifactId>
  <version>3.2.0version>
dependency>

2、连接 Redis

public class JedisDemo { 
       
  public static void main(String[] args) { 
       
    Jedis jedis = new Jedis("192.168.57.101", 6379);
    String pong = jedis.ping();
    System.out.println("连接成功:" + pong);
    jedis.close();
  }
}

Key

jedis.set("k1", "v1");
jedis.set("k2", "v2");
jedis.set("k3", "v3");
Set<String> 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"));

String

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

List

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

Set

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

Hash

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

zset

jedis.zadd("zset01", 100d, "z3");
jedis.zadd("zset01", 90d, "l4");
jedis.zadd("zset01", 80d, "w5");
jedis.zadd("zset01", 70d, "z6");

Set<String> zrange = jedis.zrange("zset01", 0, -1);
for (String e : zrange) { 
       
System.out.println(e);
}

Jedis实例-手机验证码
要求:
1、输入手机号,点击发送后随机生成6位数字码,2分钟有效
2、输入验证码,点击验证,返回成功或失败
3、每个手机号每天只能输入3次

思路:

生成随机6位数字验证码:Random
验证码在2分钟内有效:把验证码放到redis里面,设置过期时间120秒
判断验证码是否一致:从redis获取验证码和输入的验证码进行比较
每个手机每天只能发送3次验证码:incr每次发送后+1,大于2的时候,提交不能发送

生成六位的验证码:

//1.生成6位数字验证码
public static String getCode() { 
       
    Random random = new Random();
    String code = "";
    for(int i=0;i<6;i++) { 
       
        int rand = random.nextInt(10);
        code += rand;
    }
    return code;
}

验证码只能发送三次:
验证码只能发送三次,通过incr进行

//2 每个手机每天只能发送三次,验证码放到redis中,设置过期时间120
public static void verifyCode(String phone) { 
       
    //连接redis
    Jedis jedis = new Jedis("172.22.109.205",6379);

    //拼接key
    //手机发送次数key
    String countKey = "VerifyCode"+phone+":count";
    //验证码key
    String codeKey = "VerifyCode"+phone+":code";

    //每个手机每天只能发送三次
    String count = jedis.get(countKey);
    if(count == null) { 
       
        //没有发送次数,第一次发送
        //设置发送次数是1
        jedis.setex(countKey,24*60*60,"1");
    } else if(Integer.parseInt(count)<=2) { 
       
        //发送次数+1
        jedis.incr(countKey);
    } else if(Integer.parseInt(count)>2) { 
       
        //发送三次,不能再发送
        System.out.println("今天发送次数已经超过三次");
        jedis.close();
    }

    //发送验证码放到redis里面
    String vcode = getCode();
    jedis.setex(codeKey,120,vcode);//120秒
    jedis.close();
}

验证码验证相同与否:
验证码的key 与code是否相等

//3 验证码校验
public static void getRedisCode(String phone,String code) { 
       
    //从redis获取验证码
    Jedis jedis = new Jedis("172.22.109.205",6379);
    //验证码key
    String codeKey = "VerifyCode"+phone+":code";
    String redisCode = jedis.get(codeKey);
    //判断
    if(redisCode.equals(code)) { 
       
        System.out.println("成功");
    }else { 
       
        System.out.println("失败");
    }
    jedis.close();
}

完整功能代码展示

public class PhoneCode { 
       

    public static void main(String[] args) { 
       
        //模拟验证码发送
        verifyCode("13678765435");

        //模拟验证码校验
        //getRedisCode("13678765435","4444");
    }

    //3 验证码校验
    public static void getRedisCode(String phone,String code) { 
       
        //从redis获取验证码
        Jedis jedis = new Jedis("172.22.109.205",6379);
        //验证码key
        String codeKey = "VerifyCode"+phone+":code";
        String redisCode = jedis.get(codeKey);
        //判断
        if(redisCode.equals(code)) { 
       
            System.out.println("成功");
        }else { 
       
            System.out.println("失败");
        }
        jedis.close();
    }

    //2 每个手机每天只能发送三次,验证码放到redis中,设置过期时间120
    public static void verifyCode(String phone) { 
       
        //连接redis
        Jedis jedis = new Jedis("172.22.109.205",6379);

        //拼接key
        //手机发送次数key
        String countKey = "VerifyCode"+phone+":count";
        //验证码key
        String codeKey = "VerifyCode"+phone+":code";

        //每个手机每天只能发送三次
        String count = jedis.get(countKey);
        if(count == null) { 
       
            //没有发送次数,第一次发送
            //设置发送次数是1
            jedis.setex(countKey,24*60*60,"1");
        } else if(Integer.parseInt(count)<=2) { 
       
            //发送次数+1
            jedis.incr(countKey);
        } else if(Integer.parseInt(count)>2) { 
       
            //发送三次,不能再发送
            System.out.println("今天发送次数已经超过三次");
            jedis.close();
            return;//超过三次之后就会自动退出不会再发送了,不添加这一行,即使显示发送次数,但还会有验证码接收到
        }

        //发送验证码放到redis里面
        String vcode = getCode();//调用生成的验证码
        jedis.setex(codeKey,120,vcode);//设置生成的验证码只有120秒的时间
        jedis.close();
    }

    //1 生成6位数字验证码,code是验证码
    public static String getCode() { 
       
        Random random = new Random();
        String code = "";
        for(int i=0;i<6;i++) { 
       
            int rand = random.nextInt(10);
            code += rand;
        }
        return code;
    }
}

Spring Boot整合Redis
创建一个工程为Spring Initializr
1.整合依赖文件
springboot和连接池

<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data元器件数据手册、IC替代型号,打造电子元器件IC百科大全!
          

相关文章