【Web开发技术】数据缓存中间件Redis(非关系型数据库)

news2024/11/15 21:23:32

文章目录

    • 一、引言
      • 1、介绍
      • 2、五种常用数据类型
    • 二、配置
      • 1、下载
      • 2、使用
    • 三、使用
      • 1、命令行操作
        • (1)字符串
        • (2)哈希
        • (3)列表
        • (4)集合 set
        • (5)有序集合 sorted set
        • (6)通用指令
      • 2、Java操作
        • (1)依赖
        • (2)数据源配置(yml)
        • (3)配置类
        • (4)测试连接
        • (5)使用

一、引言

关于Redis的介绍很多,我就介绍关于我在web开发中使用到比较多的点。

1、介绍

基于内存可持久化的日志型、Key-Value数据库。说到这就可以想到Java中字典性集合:Map、Map<String,String>、Map<String,Object>等。就和Redis的字符型数据类型一样。

2、五种常用数据类型

  • 字符串(string):普通字符串,Redis中最简单的数据类型
  • 哈希(hash):也叫散列,类似于Java中的HashMap结构
  • 列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList
  • 集合(set):无序集合,没有重复元素,类似于Java中的HashSet
  • 有序集合(sorted set/zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素。

在这里插入图片描述

二、配置

1、下载

  • Windows下载地址:https://github.com/microsoftarchive/redis/releases
  • Linux下载地址:https://download.redis.io/releases/

2、使用

  • 1、下载完,选择路径(例,之后都是这个)d:\redis解压
  • 2、命令行打开路径(cd d:\redis)
  • 3、输入(redis-server.exe redis.windows.conf)启动服务
  • (如果只是练习,可以不设置服务密码)

三、使用

1、命令行操作

(1)字符串

# 存入一个name(名字)叫xiaohua
set name xiaohua
# 读取名字
get name

# 存入age(年龄)18,并用21覆盖
set age 18
set age 21
# 获取到21,18被后来者覆盖
get age

# 过期策略,设置保存code(验证码)为abcd,只有十秒存在时间
setex code 10 abcd
# 十秒之后code -> null
get code

# setnx key value 只有在 key 不存在时设置 key 的值
setnx a 666 
setnx a 999
# 返回999
get a

(2)哈希

# 往key 为001 存入 hash键值对 2对
hset 001 name xiaohua
hset 001 age  23
hset 002 name xiaomei
hset 002 age  18

# HGET key field 获取存储在哈希表中指定字段的值
# 获取002中的 name的值
hget 002 name

# HDEL key field 删除存储在哈希表中的指定字段
# 删除 002 中的name
hdel 002 name

# HKEYS key 获取哈希表中所有字段
hkeys 002

# HVALS key 获取哈希表中所有值
HVALS 002

# HGETALL key 获取在哈希表中指定 key 的所有字段和值
HGETALL 001

(3)列表

# LPUSH key value1 [value2] 将一个或多个值插入到列表头部
LPUSH list1 a b c d
LPUSH list2 1 2 3 4
LPUSH list3 4 3 2 1

# LRANGE key start stop 获取列表指定范围内的元素
LRANGE list1 0 -1 # 查所有
# a最先插入,所以在尾部

# RPOP key 移除并获取列表最后一个元素
RPOP list1 # 返回a   当然a没有了

# LLEN key 获取列表长度
LLEN list1  # 3

# BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超 时或发现可弹出元素为止
BRPOP list1  10  

(4)集合 set


# SADD key member1 [member2] 向集合添加一个或多个成员
SADD set1 a b c
SADD set2 1 2 3

# SMEMBERS key 返回集合中的所有成员
SMEMBERS set1

# SCARD key 获取集合的成员数
SCARD  set1

# SINTER key1 [key2] 返回给定所有集合的交集
SINTER set1 set2 # a 交集是a

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

SUNION set1 set2  # a b c 2 3

# SDIFF key1 [key2] 返回给定所有集合的差集

SDIFF set1 set2  #注意顺序 2者相减

# SREM key member1 [member2] 移除集合中一个或多个成员
SREM set1 a b # 删除元素

(5)有序集合 sorted set

# ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的 分数
zadd sset1  0.1 a  4.0 b 2.1 c
zadd sset2  9.0 p  8.8 w 7.0 q

# ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
ZRANGE sset1 0 -1 # 获得全部
ZRANGE sset1 0 -1  WITHSCORES # 分数也会显示

# ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
ZINCRBY  sset1 20 b #意味着b的分值改变了
# 可以查询下
ZRANGE sset1 0 -1  WITHSCORES

# ZREM key member [member ...] 移除有序集合中的一个或多个成员
ZREM sset1 b #将b这个元素移除

(6)通用指令

# KEYS pattern 查找所有符合给定模式( pattern)的 key
KEYS * #查询所有的key

# EXISTS key 检查给定 key 是否存在
EXISTS name

# TYPE key 返回 key 所储存的值的类型
TYPE name

# TTL key 返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位
# -1表示一直存在
TTL name

# DEL key 该命令用于在 key 存在是删除 key
DEL  name
#查询所有的key
KEYS * 

2、Java操作

以在Spring Boot架构中的使用为例

(1)依赖

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

(2)数据源配置(yml)

spring:
  redis:
    host: localhost     # 服务器IP
    port: 6379          # 端口号
    password:           # 服务密码,需设置,不设置为空
    database: 10        # 数据库编号

(3)配置类

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@Slf4j
public class RedisConfiguration {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        log.info("创建Redis模板对象...");
        
        RedisTemplate redisTemplate = new RedisTemplate();
        //设置redis的连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置redis key的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

(4)测试连接

	@Resource
    RedisTemplate redisTemplate;
    
    @Test
    public void redisTemplates(){
        //string数据操作
        ValueOperations valueOperations = redisTemplate.opsForValue();
        //hash类型的数据操作
        HashOperations hashOperations = redisTemplate.opsForHash();
        //list类型的数据操作
        ListOperations listOperations = redisTemplate.opsForList();
        //set类型数据操作
        SetOperations setOperations = redisTemplate.opsForSet();
        //zset类型数据操作
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    }

(5)使用

  • 字符型
		// set get setex setnx
        redisTemplate.opsForValue().set("name","xioahua");
        String city = (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");
  • 哈希
		//hset hget hdel hkeys hvals
        HashOperations hashOperations = redisTemplate.opsForHash();

        hashOperations.put("100","name","xiaohua");
        hashOperations.put("100","age","20");

        String name = (String) hashOperations.get("100", "name");
        System.out.println(name);

        Set keys = hashOperations.keys("100");
        System.out.println(keys);

        List values = hashOperations.values("100");
        System.out.println(values);

        hashOperations.delete("100","age");
  • 列表
		//lpush lrange rpop llen
        ListOperations listOperations = redisTemplate.opsForList();

        listOperations.leftPushAll("mlist","a","b","c");
        listOperations.leftPush("mlist","d");

        List mylist = listOperations.range("mlist", 0, -1);
        System.out.println(mylist);

        listOperations.rightPop("mlist");

        Long size = listOperations.size("mlist");
        System.out.println(size);
  • 集合
	 	//sadd smembers scard sinter sunion srem
        SetOperations setOperations = redisTemplate.opsForSet();

        setOperations.add("set1","a","b","c","d");
        setOperations.add("set2","a","b","x","y");

        Set members = setOperations.members("set1");
        System.out.println(members);

        Long size = setOperations.size("set1");
        System.out.println(size);

        Set intersect = setOperations.intersect("set1", "set2");
        System.out.println(intersect);

        Set union = setOperations.union("set1", "set2");
        System.out.println(union);

        setOperations.remove("set1","a","b");
  • 有序集合
		//zadd zrange zincrby zrem
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        zSetOperations.add("zset1","a",10);
        zSetOperations.add("zset1","b",12);
        zSetOperations.add("zset1","c",9);

        Set zset1 = zSetOperations.range("zset1", 0, -1);
        System.out.println(zset1);

        zSetOperations.incrementScore("zset1","c",10);

        zSetOperations.remove("zset1","a","b");
  • 通用指令
		//keys exists type del
        Set keys = redisTemplate.keys("*");
        System.out.println(keys);

        Boolean name = redisTemplate.hasKey("name");
        Boolean set1 = redisTemplate.hasKey("set1");

        for (Object key : keys) {
            DataType type = redisTemplate.type(key);
            System.out.println(type.name());
        }

        redisTemplate.delete("mlist");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python基础练习题20道,快收藏起来检测自己吧 !

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 实例001&#xff1a;数字组合 题目&#xff1a; 有四个数字&#xff1a;1、2、3、4&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;各是多少&#xff1f; 答案跳转 实例002&#xff1a;“个税计…

路径规划算法:基于乌燕鸥优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于乌燕鸥优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于乌燕鸥优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

Leetcode 剑指 Offer II 029. 排序的循环链表

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定循环单调非递减列表中的一个点&#xff0c;写一个函数向这个…

基于QT的智能家居中控系统的简明设计

文章目录 系统总体说明主板UI设计后续改进与完善 系统总体说明 系统采用 “主从式架构” &#xff0c;即一主多从式&#xff0c;该智能居家控制系统的主要功能包括登录功能、注册功能、音乐播放功能、时间显示、日历显示、温度湿度光照气压海拔数据等环境指标数据显示等。   …

【Linux】基于阻塞队列的生产消费模型

文章目录 生产者消费者模型基本概念生产者消费者模型优点生产者消费者模型的特点 基于阻塞队列的生产者消费者模型阻塞队列-BlockingQueue C模拟实现基于阻塞队列的生产消费模型BlockQueue.hpp基本框架构造析构判空&&判满从阻塞队列插入数据向阻塞队列获取数据 Cptest.…

用pandasai轻松上手Python数据分析

一、引言 最近&#xff0c;一位名叫Gabriele Venturi的软件工程师在github上建立了pandasai的项目。据官方介绍&#xff0c;pandasai是一个 Python 第三方库&#xff0c;将人工智能的生成能力集成到pandas包中&#xff0c;使数据分析具有对话性。实际上&#xff0c;该第三方包…

Vue表格Table精美模板分享

文章目录 &#x1f412;个人主页&#x1f3c5;Vue项目常用组件模板仓库&#x1f4d6;前言&#xff1a;&#x1f380;源码如下&#xff1a; &#x1f412;个人主页 &#x1f3c5;Vue项目常用组件模板仓库 &#x1f4d6;前言&#xff1a; 本篇博客主要提供vue组件之表格组件模板…

16、MongonDB数据库的基本使用

1、MongonDB简介 问答什么是MongoDB一个以JSON为数据模型的文档非关系型数据库什么是非关系型数据库NoSQL&#xff0c;—种区分关系型数据库的数据存储方案&#xff0c;具有易扩展&#xff0c;大数据量&#xff0c;高性能&#xff0c;灵活数据模型&#xff0c;高可用等特点为什…

Vue面试题合集(原理深入,持续更新)

2023Vue面试题剖析原理 18.生命周期有哪些19.Vue中的diff算法原理diff概念diff比较流程 20.Vue中key的作用和原理key的概念key的作用 21.Vue.use作用和原理use概念插件的功能实现原理 22.Vue.extend方法的作用Vue.extend概念原理分析 23.Vue组件中data为什么必须是函数24.函数式…

SqlServer的基本使用

本文章主要是交给大家SqlServer的基本用法&#xff0c;因为SqlServer本身的运行机制问题&#xff0c;会让很多人觉得sql语句是不是写错了&#xff1f;这个代码有问题&#xff1f; 文章目录 选中数据库语法报错&#xff1f;执行部分代码存储过程、触发器只能创建一次sql书写建议…

如何在Linux c/c++ 进行多播(组播)编程

第一章: 前言 多播技术&#xff0c;也被称为“组播”&#xff0c;是一种网络通信机制&#xff0c;它允许一个节点&#xff08;发送者&#xff09;向一组特定的节点&#xff08;接收者&#xff09;发送信息。这种方式在网络编程中非常有用&#xff0c;因为它可以大大提高效率和…

Git、GitFlow协作 、Git commit规范、语义化版本

目录 一、概述 二、Git 2.1 安装与配置 2.2 基本指令操作 2.3 创建一个新的存储库 2.4 推送一个已有的文件夹 2.5 忽略临时文件 2.6 添加commit模板 2.7 冲突解决 二、GitFlow协作 三、Git Commit规范 四、语义化版本 为什么需要语义化版本号&#xff1f; 什么是…

线段树为什么可以开三倍空间

参考链接 四倍空间的原因如上图所示&#xff0c;但是实际操作时&#xff0c;我们可以直接开三倍空间也是可以的。 原因分析&#xff1a; 由于在分割区间时&#xff0c;我们计算mid使用下取整&#xff0c;所以左边区间大小大于等于右边区间大小&#xff0c;如果要实现上图中的树…

智能路由器开发之创建一个procd init脚本示例

智能路由器开发之创建一个procd init脚本示例 Procd init脚本默认提供了许多好用的功能&#xff0c;例如重启策略和能够从UCI系统中存储和读取配置。 设置 举个例子&#xff0c;假设我们想创建一个作为服务的Shell脚本&#xff0c;并且这个服务可以通过消息和超时时间进行配…

C语言---初识指针

1、指针是什么 指针是什么&#xff1f; 指针理解的2个要点&#xff1a; ​ 1、指针是内存中一个最小单元的编号&#xff0c;也就是地址。 ​ 2、平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量 总结&#xff1a;指针就是地址&#xff…

Docker+Jenkins+Gitee自动化部署maven项目,加入Nexus镜像仓库(补充篇)

1.前言 Hello&#xff0c;各位小伙伴&#xff0c;大家好&#xff01;&#xff01;&#xff01; 在【DockerJenkinsGitee自动化部署maven项目】一文中&#xff0c;我们介绍了如何使用Jenkins来实现自动化部署maven项目&#xff0c;没读过的小伙伴可以去回顾一下&#xff0c;这…

【求 一个人去给多个人拜年 的最短路径】【枚举所有 拜访顺序】新年好

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

ChatGPT 70个插件小测全纪录

以下插件排序按照 ChatGPT all plugins 列表,评分基于国人使用场景。 1)Polarr:用于处理和编辑图片的工具 Polarr插件可以帮助用户进行各种图片编辑任务,包括调整亮度、对比度、饱和度,应用滤镜,裁剪图片,以及其他一些高级的图片处理功能。这个插件可以让ChatGPT更好地…

章节1:XXE漏洞-上

章节1&#xff1a;XXE漏洞-上 01 XML基础知识 XML eXtensible Markup Language 可扩展标记语言 XML用途 配置文件 交换数据 XML内容 XML格式要求 XML文档必须有根元素XML文档必须有关闭标签XML标签对大小写敏感XML元素必须被正确的嵌套XML属性必须加引号 XML格式校验 …

耗时 48小时整理了网络安全学习路线,非常详细!

前言 上次发的文章【都2023年了&#xff0c;还在问网络安全怎么入门】很多小伙伴在评论区回复不知道怎么学习&#xff0c;我也反思了一下&#xff0c;确实没写到学习方法和路线&#xff0c;所以这一期就出一一个怎么学习网络安全的学习路线和方法&#xff0c;觉得有用的话三连…