当前位置: 首页 > news >正文

苍穹外卖个人技术总结Day03

1.Redis介绍

Redis是一种以键值对 key-value形式存储于内存的的非传统型数据库,常用于存储热点数据,其中key为字符串类型,而value可以为字符串、队列、集合、哈希等形式

1.1 Redis服务的启动

在控制台页面输入redis-server.exe redis.windows.conf

这样就说明Redis启动成功,输入Ctrl c即可退出服务

1.2 Redis修改配置文件

打开Redis中的redis.windows.conf 文件,输入Ctrl f,在搜索栏中输入pass加空格,将前面的# 删除,将requirepass 后面的部分改成自己想定义的密码,比如123456

特别提醒:
修改完密码后需要重新启动redis服务

1.3测试Redis的连接

(1) 在控制台输入redis.cli.exe,在输入keys * ,此时会发现报错,显示我们没有权限,因为前面我们设置了redis的密码,所以我们连接的时候还需要把密码配置上去。

这样redis的连接也成功,输入exit退出服务

(2) 除此之外,还可以通过Redis客户端图形工具来操作

2.Redis常用数据类型与命令操作

特别提醒:以下操作命令都不区分大小写

2.1字符串(String)

定义:普通字符串,Redis中最简单的数据类型

常用命令:
set key value 设置指定key的值

get key 获取指定key的值

setex key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒

setnx key value 只有在 key 不存在时设置 key 的值

2.2哈希(Hash)

定义:散列, 类似于Java中的哈希表结构

常用命令:
hset key field value 将哈希表 key 中的字段 field 的值设为 value

hget key field 获取存储在哈希表中field字段的值

hdel key field 删除存储在哈希表中的field字段

hkeys key 获取哈希表中所有field字段

hvals key 获取哈希表中所有value值

2.3列表(List)

定义:类似于一个队列,按照插入顺序排序,可以有重复元素

常用命令:
lpush key value1 [value2] 将一个或多个值插入到列表头部

lrange key start stop 获取列表指定范围内的元素

rpop key 移除并获取列表最后一个元素(R:right)

lpop key 移除并获取列表第一个元素(L:left)

llen key 获取列表长度

2.4 集合(Set)

定义:无序集合,没有重复元素,类似于Java中的HashSet

常用命令:
sadd key member1 [member2] 向集合添加一个或多个成员

smembers key 返回集合中的所有成员

scard key 获取集合的成员数

sinter key1 [key2] 返回给定所有集合的交集

sunion key1 [key2] 返回所有给定集合的并集

srem key member1 [member2] 移除集合中一个或多个成员

2.5有序集合(ZSet)

定义:集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

常用命令:
zadd key score1 member1 [score2 member2] 向有序集合添加一个或多个成员

zrange key start stop [withscores] 通过索引区间返回有序集合中指定区间内的成员

zincrby key increment member 有序集合中对指定成员的分数加上增量 increment

zrem key member [member …] 移除有序集合中的一个或多个成员

2.6通用命令

定义:不分数据类型,都可以使用的命令

常用命令:
keys pattern 查找所有符合给定模式( pattern)的 key

exists key 检查给定 key 是否存在

type key 返回 key 所储存的值的类型

del key 该命令用于在 key 存在时删除 key

3.用Java操作Redis

3.1 Redis的Java客户端

介绍:在Java开发中,Redis是必不可少的一环,所以我们也需要使用Java去操作Redis,那对于此,我们便需要在Redis的Java客户端使用。 Redis的Java客户端常用的有以下三种,Jedis、Lettuce、Spring Data Redis,在本项目中,我们采用的是Spring Data Redis,因为Spring对Redis底层进行了高度封装,在Spring项目中,可以使用Spring Data Redis来简化操作。

3.2 Spring Data Redis的使用

3.2.1 导入依赖

在sky-server包下的pom.xml文件导入对应的maven坐标

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

3.2.2 配置数据

在application-dev.yml文件将redis所需的数据值定义好,在application.yml文件中采用引用文件的形式将dev.!yml的数据值引入进来。
appliction.yml

3.2.3定义配置文件

说明:该配置文件不是必须的,因为Spring Boot框架会自动装配RedisTemplate这个处理Redis数据库的对象,但同时也会采用jdk默认的序列化方式,可能会导致呈现出来的数据是可读性极差的二进制格式。
所以为了避免可读性的问题,定义该配置类的目的在于手动设置序列化器,让呈现出来的数据具有可读性。

操作步骤:
因为是配置类,所以在config包下定义RedisConfiguration类,去创建RedisTemplate对象

@Configuration@Slf4jpublicclassRedisConfiguration{@BeanpublicRedisTemplateredisTemplate(RedisConnectionFactoryfactory){log.info("创建RedisTemplate对象");RedisTemplateredisTemplate=newRedisTemplate();//设置redis的连接工厂redisTemplate.setConnectionFactory(factory);//设置redis的key序列化器//将Java中的String类型的key直接以字符串形式存储到Redis中,避免了默认的JDK序列化方式(会将字符串转换成字节码,导致Redis中存储的key可读性差redisTemplate.setKeySerializer(newStringRedisSerializer());returnredisTemplate;}}

3.2.4 测试

在test包下新建测试类SpringDataRedisTest,然后对上述六种操作类型进行测试

(1)字符串

@TestpublicvoidtestString(){// set get setex setnxredisTemplate.opsForValue().set("name","小明");Stringcity=(String)redisTemplate.opsForValue().get("name");System.out.println(city);redisTemplate.opsForValue().set("code","1234",3,TimeUnit.MINUTES);redisTemplate.opsForValue().setIfAbsent("lock","1");redisTemplate.opsForValue().setIfAbsent("lock","2");}

(2)哈希

@TestpublicvoidtestHash(){//hset hget hdel hkeys hvalsHashOperationshashOperations=redisTemplate.opsForHash();hashOperations.put("100","name","tom");hashOperations.put("100","age","20");Stringname=(String)hashOperations.get("100","name");System.out.println(name);Setkeys=hashOperations.keys("100");System.out.println(keys);Listvalues=hashOperations.values("100");System.out.println(values);hashOperations.delete("100","age");}

(3)列表

@TestpublicvoidtestList(){//lpush lrange rpop llenListOperationslistOperations=redisTemplate.opsForList();listOperations.leftPushAll("mylist","a","b","c");listOperations.leftPush("mylist","d");Listmylist=listOperations.range("mylist",0,-1);System.out.println(mylist);listOperations.rightPop("mylist");Longsize=listOperations.size("mylist");System.out.println(size);}

(4)集合

@TestpublicvoidtestSet(){//sadd smembers scard sinter sunion sremSetOperationssetOperations=redisTemplate.opsForSet();setOperations.add("set1","a","b","c","d");setOperations.add("set2","a","b","x","y");Setmembers=setOperations.members("set1");System.out.println(members);Longsize=setOperations.size("set1");System.out.println(size);Setintersect=setOperations.intersect("set1","set2");System.out.println(intersect);Setunion=setOperations.union("set1","set2");System.out.println(union);setOperations.remove("set1","a","b");}

(5)有序集合

@TestpublicvoidtestZset(){//zadd zrange zincrby zremZSetOperationszSetOperations=redisTemplate.opsForZSet();zSetOperations.add("zset1","a",10);zSetOperations.add("zset1","b",12);zSetOperations.add("zset1","c",9);Setzset1=zSetOperations.range("zset1",0,-1);System.out.println(zset1);zSetOperations.incrementScore("zset1","c",10);zSetOperations.remove("zset1","a","b");}

(6)常用命令

@TestpublicvoidtestCommon(){//keys exists type delSetkeys=redisTemplate.keys("*");System.out.println(keys);Booleanname=redisTemplate.hasKey("name");Booleanset1=redisTemplate.hasKey("set1");for(Objectkey:keys){DataTypetype=redisTemplate.type(key);System.out.println(type.name());}redisTemplate.delete("mylist");}

插入一个知识点

以字符串为例子,把配置类中设置key序列化器的方法注释掉,向redis设置数据,设为B;然后把序列化器的注释删掉,用自定义的序列器设置数据,设为A。
在常用命令测试时,type.name()会显示B数据为none,而A数据正常

原因:对于B数据而言,存进redis时是以jdk默认的序列化器进行序列化存进去,也就是以字节数组的形式,,然后当通过keys(“ * ”)这个方法获取key时,实际上是将redis中的数据进行了反序列化,以一个Java对象返回。然后再执行type(key)这个方法时,实际上是又执行了一次jdk默认的序列化器加工,但是jdk默认的序列化器进行序列化时并不能保证两次结果一致,这就导致redis并不能去匹配到相应数据,所以数据B显示的是none。

然而我们在配置类中使用的StringRedisSerializer具有确定性,即序列化时能保证数据的一致性,所以Redis可以匹配到,也因此数据A是正常显示的

http://www.jsqmd.com/news/483677/

相关文章:

  • OneAPI镜像免配置部署教程:单文件Docker开箱即用,支持OpenAI/Gemini/Claude等全生态
  • MATLAB矩阵的操作|从线代到实战,一篇就够!
  • CentOS 7.9.2009升级最新的Linux Kernel 6.9.7
  • B站UP主生产力工具:AnythingtoRealCharacters2511快速生成视频开场真人化角色动画
  • Qwen3-ASR-1.7B部署教程:单卡A10/A100部署高精度语音识别系统
  • SecGPT-14B部署教程:解决模型加载失败、Chainlit连接超时问题
  • MiniCPM-o-4.5-nvidia-FlagOS开发者案例:接入企业知识库实现图文混合RAG检索
  • BGE-Large-Zh惊艳效果:中文长句(50字)仍保持高精度语义向量化
  • FireRed-OCR Studio效果展示:学术会议投稿系统PDF→作者信息+摘要+关键词+参考文献自动抽取
  • yz-bijini-cosplay完整指南:Z-Image原生Transformer架构适配解析
  • Qwen3-VL-4B Pro部署教程:GPU优化版图文对话模型一键启动
  • CLIP-GmP-ViT-L-14效果验证:90% ImageNet准确率在真实业务数据表现
  • AI语义搜索与轻量化生成项目部署指南:GTE-Chinese-Large+SeqGPT-560m保姆级教程
  • Qwen3-ForcedAligner-0.6B入门必看:参考文本编写规范与错字容错边界
  • [特殊字符] GLM-4V-9B用户体验:非技术人员使用满意度调研结果
  • Qwen3-VL:30B飞书办公提效:招聘JD截图→岗位要求提取→候选人匹配度评分
  • Qwen3-VL部署避坑指南:交错MRoPE配置错误导致崩溃解决方案
  • ollama部署Phi-4-mini-reasoning入门指南:面向学生与工程师的推理模型实践
  • Qwen3-VL-2B-Instruct环境部署:Docker与非Docker方案对比
  • Cosmos-Reason1-7B镜像部署:CentOS/Ubuntu双系统兼容性验证报告
  • 美胸-年美-造相Z-Turbo开源可持续:CSDN技术博客持续更新+Discord社区支持
  • 文墨共鸣GPU利用率提升:StructBERT双塔推理显存占用降低42%实测
  • FireRedASR-AED-L镜像免配置:Docker Compose一键启停+日志自动轮转
  • Chord服务灰度发布:Qwen2.5-VL模型版本AB测试与效果追踪方案
  • Qwen3-32B漫画脸描述生成多场景落地:短视频MCN机构二次元IP孵化SOP
  • SiameseUIE惊艳效果展示:古籍文本中‘朝代’‘人物’‘官职’跨时代实体识别
  • AI读脸术开发者必看:OpenCV DNN调用避坑实战教程
  • Qwen2.5-72B-Instruct-GPTQ-Int4快速上手:免配置镜像+Web交互全流程
  • Cosmos-Reason1-7B镜像免配置:开箱即用WebUI搭建物理AI开发环境
  • 影墨·今颜效果对比实验:不同Scale值对‘电影感’与‘写实度’影响