尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

redis学习

redis学习 Redis 没有 “表” 这个概念MySQL 是关系型数据库库 → 表 → 行 → 字段。Redis 是键值数据库NoSQL没有表没有行没有列。存储模型就是key(键) → value(值)。MySQL建库 → create database建表 create table xxxRedis不需要建表直接存 key。Redis 五种常用数据类型相当于 MySQL 不同的 “表”你可以把每一类 key想象成一张逻辑表人为给 key 加前缀来模拟表。1️⃣ String 字符串最简单存单个值类比 MySQL 一行的某个字段redis# 模拟 user表 id1 的nameset user:1:name 张三get user:1:nameuser:1:name 就是 key冒号只是约定分隔符没有语法强制。2️⃣ Hash 哈希最像 MySQL 一行记录重点✅Hash 就最接近 MySQL 的一行数据适合存对象相当于模拟一行记录redis# 模拟 user表 id1 用户字段 id,name,agehset user:1 id 1 name ldrnf age 20# 获取整个用户hgetall user:1# 只拿namehget user:1 namekeyuser:1 想象成 user 表 第 1 行hash 内部field 就是字段value 就是字段值。这里 user: 只是人为命名不是系统建表命令Redis 不会校验。3️⃣ List 列表数组redislpush list:goods 苹果 香蕉 橙子lrange list:goods 0 -14️⃣ Set 集合去重集合redissadd set:tag java spring redissmembers set:tag5️⃣ ZSet 有序集合排行榜rediszadd zset:rank 90 小明 85 小红zrange zset:rank 0 -1 withscores常用小命令keys user:* # 查询所有以user:开头的key相当于查user逻辑“表”全部数据 del user:1 # 删除这条记录类似delete exists user:1 # 判断这条记录是否存在继续敲几条练习感受 Hash 常用操作# 只获取name字段 hget user:1 name # 修改age为21 hset user:1 age 21 # 只获取age hget user:1 age # 删除age字段 hdel user:1 age # 再看全部 hgetall user:1redis数据类型类型存储样子核心特点业务场景String 字符串hello world最简单key 对应一个字符串可以存文本、数字、json可以做自增incr缓存普通数据、计数器、session、验证码Hash 哈希{name:Jack,age:21}类似对象一个 key 下面存多个 field‑value适合存对象不用序列化 JSON用户缓存、商品对象部分字段更新List 列表[A→B→C→C]双向链表允许重复元素两头插入删除极快中间慢有序消息队列、最新浏览记录、排行榜简单列表Set 集合{A,B,C}自动去重无序不允许重复值支持交并差集运算标签、点赞用户集合、共同好友SortedSet (ZSet) 有序集合{A:1,B:2,C:3}去重 排序每个成员带 score 分数按分数自动排序排行榜、热搜、延时队列GEO 地理位置{A:(120.3,30.5)}存储经纬度计算两点距离、附近的人附近门店、定位查找BitMap 位图0110110101110101011本质是 String用 0/1 比特位存储极度省内存签到统计、用户是否打卡、活跃标记HyperLogLog二进制比特流专门做基数统计占用内存极小允许少量误差不能取出原始数据统计 UV独立访客统计访问人数不去存每个用户jedis快速入门Java语言可以通过Jedis来连接Redis并操作Redis。二、基本使用dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdversion4.4.1/version/dependency安装完 Redis 的驱动程序 后接下来就是连接 Redis 服务器。最简单的连接方式就是通过 Jedis 对象连接。代码如下//引入Redis驱动程序import redis.clients.jedis.Jedis;public class RedisJava {public static void main(String[] args) {//连接本地的 Redis 服务Jedis jedis new Jedis(localhost,6379);// 如果设置 Redis 服务的密码需要进行验证若没有则可以省去// jedis.auth(123456);System.out.println(连接成功);//查看服务是否运行System.out.println(服务正在运行: jedis.ping());//设置 redis 字符串数据jedis.set(webkey, swawdwa);// 获取存储的数据并输出System.out.println(redis 存储的字符串为: jedis.get(webkey));}}同时我们可以使用Jedis 来操作Redis当中的事务。Redis 事务可以理解为一个打包的批量执行脚本但批量指令并非原子化的操作中间某条指令的失败不会导致前面已做指令的回滚也不会造成后续的指令不做。我们可以通过try-catch可以让他具备原子性。Testvoid contextLoads1() {Jedis jedis new Jedis(127.0.0.1, 6379);// 情况数据库jedis.flushDB();// 开启事务Transaction multi jedis.multi();// jedis.watch(result)try {multi.set(user1, 123);multi.set(user2, 456);// 代码抛出异常事务执行失败int i 1 / 0;// 执行事务multi.exec();} catch (Exception e) {// 放弃事务multi.discard();e.printStackTrace();} finally {System.out.println(jedis.get(user1));System.out.println(jedis.get(user2));jedis.close(); // 关闭连接}}同时Jedis也支持发布订阅连接池public class RedisPoolUtils { private static JedisPool jedisPool null; /** * redis服务器地址 */ private static String addr 127.0.0.1; /** * redis服务器端口 */ private static int port 6379; /** * redis服务器密码 */ private static String auth 111111; static { try { JedisPoolConfig config new JedisPoolConfig(); // 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true config.setBlockWhenExhausted(true); // 设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数) config.setEvictionPolicyClassName(org.apache.commons.pool2.impl.DefaultEvictionPolicy); // 是否启用pool的jmx管理功能, 默认true config.setJmxEnabled(true); // MBean ObjectName new ObjectName(org.apache.commons.pool2:typeGenericObjectPool,name pool i); 默认为pool, JMX不熟,具体不知道是干啥的...默认就好. config.setJmxNamePrefix(pool); // 是否启用后进先出, 默认true config.setLifo(true); // 最大空闲连接数, 默认8个 config.setMaxIdle(8); // 最大连接数, 默认8个 config.setMaxTotal(8); // 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1 config.setMaxWaitMillis(-1); // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟) config.setMinEvictableIdleTimeMillis(1800000); // 最小空闲连接数, 默认0 config.setMinIdle(0); // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3 config.setNumTestsPerEvictionRun(3); // 对象空闲多久后逐出, 当空闲时间该值 且 空闲连接最大空闲数 时直接逐出,不再根据MinEvictableIdleTimeMillis判断 (默认逐出策略) config.setSoftMinEvictableIdleTimeMillis(1800000); // 在获取连接的时候检查有效性, 默认false config.setTestOnBorrow(false); // 在空闲时检查有效性, 默认false config.setTestWhileIdle(false); // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 config.setTimeBetweenEvictionRunsMillis(-1); jedisPool new JedisPool(config, addr, port, 3000, auth); } catch (Exception e) { e.printStackTrace(); } } /** * 获取 Jedis 资源 * * return */ public static Jedis getJedis() { if (jedisPool ! null) { return jedisPool.getResource(); } return null; } /** * 释放Jedis资源 */ public static void close(final Jedis jedis) { if (jedis ! null) { jedis.close(); } } }哨兵模式哨兵模式简单的说就是一台主机一台备机外加一台监控服务当监控服务观测到主机已经宕机就会将备用机切换成主机以便继续提供服务。public class RedisPoolUtils { private static Jedis jedis; private static JedisSentinelPool jedisSentinelPool; static{ try { JedisPoolConfig config new JedisPoolConfig(); //最大空闲连接数, 默认8个 config.setMaxIdle(8); //最大连接数, 默认8个 config.setMaxTotal(8); //最小空闲连接数, 默认0 config.setMinIdle(0); //获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1 config.setMaxWaitMillis(3000); //在获取连接的时候检查有效性,表示取出的redis对象可用, 默认false config.setTestOnBorrow(true); //redis服务器列表 SetString sentinels new HashSet(); sentinels.add(new HostAndPort(192.168.43.212, 26379).toString()); sentinels.add(new HostAndPort(192.168.43.213, 26379).toString()); sentinels.add(new HostAndPort(192.168.43.214, 26379).toString()); //初始化连接池 jedisSentinelPool new JedisSentinelPool(mymaster, sentinels, config, 111111); // 从池中获取一个Jedis对象 jedis jedisSentinelPool.getResource(); } catch (Exception e) { e.printStackTrace(); } } }redis templateRedisTemplate 和 Redis 的关系Redis 服务端WSL 里跑的那个数据库RedisTemplate SpringBoot 里面的 Java 工具类客户端打个比方Redis 好比 数据库服务器MySQL 服务RedisTemplate 好比 MyBatis‑Plus专门用来在 Java 代码操作 Redis代替你手动敲 redis‑cli 命令。框架通过下载mobaXterm和virtual Box虚拟机开启提供IP主机名来使用redisVirtualBox MobaXterm 这两个工具就足够学习、操作 Redis 了分工不一样VirtualBox跑 CentOS7 虚拟机Redis 就安装在这个 Linux 系统里面。MobaXtermWindows 上的 SSH 客户端用来远程连接虚拟机敲 Linux 命令、操作 Redis比虚拟机里面小黑框好用很多。走过的一个坑不要用CentOS7太老了用CentOS9把ip写死以后虚拟机启动不用一直改项目依赖里面的ipredis: host: 192.168.10.126 port: 6379 password: 815815 lettuce: pool: max-active: 10 max-idle: 10 min-idle: 1依赖如上
返回列表