Redis 简单入门

news2024/11/18 1:51:16

✏️作者:银河罐头
📋系列专栏:JavaEE

🌲“种一棵树最好的时间是十年前,其次是现在”

目录

  • 安装 Redis
  • redis 的数据类型和使用
    • 字符串类型
    • 字典类型
    • 列表类型
    • 集合类型
    • 有序集合类型
  • SpringBoot 集成 Redis
    • 添加 redis 依赖
    • 配置 redis
    • 手动操作 redis
  • Spring Session 持久化
    • 添加依赖
    • 设置配置文件
    • 存储和读取 session
  • 持久化

安装 Redis

安装 FinalShell

https://zhuanlan.zhihu.com/p/430110272?utm_id=0

1.yum 安装 redis

使用以下命令,直接将 redis 安装到 linux 服务器:

yum -y install redis

2.启动 redis 使用以下命令,以后台运行方式启动 redis:

redis-server /etc/redis.conf &

3.操作 redis

使用以下命令启动 redis 客户端:

redis-cli

image-20230701224053107

4.设置远程连接

1.将 redis 配置文件下载到本地:redis 配置文件是 linux 下的 /etc/redis.conf ;

2.将 redis.conf 中的 “bind 127.0.0.1”注释掉;

3.将 redis.conf 中的“protected-mode yes” 改为“protected-mode no”;

4.将修改后的 redis.conf 上传至 liunx 下的 /etc 目录;

5.使用命令“redis-cli shutdown”先关闭 redis 服务,再使用“redis-server /etc/redis.conf &”启动 redis 服务。

redis 的数据类型和使用

image-20230702160733099

Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库。

https://redis.io/commands/

Redis 有 5 大基础数据类型:

String——字符串类型

Hash——字典类型

List——列表类型

Set——集合类型

ZSet——有序集合类型

字符串类型

127.0.0.1:6379> set k1 v1 #添加数据
OK
127.0.0.1:6379> get k1 #查询数据 
"v1"
127.0.0.1:6379> strlen k1 #查询字符串的长度
(integer) 2
127.0.0.1:6379> set k1 v1 ex 1000 #设置 k1 1000s 后过期
OK
# 相加
127.0.0.1:6379> set num 123
OK
127.0.0.1:6379> incr num
(integer) 124
127.0.0.1:6379> incr num
(integer) 125
127.0.0.1:6379> incrby num 10
(integer) 135

字符串的常⻅使⽤场景:

存放⽤户(登录)信息;

存放⽂章详情和列表信息;

存放和累计⽹⻚的统计信息。

字典类型

字典类型 (Hash) ⼜被成为散列类型或者是哈希表类型,它是将⼀个键值 (key) 和⼀个特殊的“哈希 表”关联起来,这个“哈希表”表包含两列数据:字段和值,它就相当于 Java 中的 Map> 结构。

假如我们使用字典类型来存储⼀篇⽂章的详情信息,存储结构如下图所示:

image-20230702113438250

127.0.0.1:6379> hset myhash key1 value1 #添加数据
(integer) 1
127.0.0.1:6379> hget myhash key1 #查询数据
"value1"
127.0.0.1:6379> HMSET myhash field2 "Hi" field3 "World"
OK
127.0.0.1:6379> HMGET myhash field2
1) "Hi"
127.0.0.1:6379> HMGET myhash field3
1) "World"

列表类型

列表类型 (List) 是⼀个使⽤链表结构存储的有序结构。

127.0.0.1:6379> rpush mylist 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lpop mylist
"1"
127.0.0.1:6379> lrange mylist 0 -1
1) "2"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> lrange mylist 1 3
1) "3"
2) "4"
3) "5"

列表的典型使⽤场景有以下两个:

消息队列

⽂章列表

redis 作用:
1.存会话信息 session

2.缓存

3.分布式锁

集合类型

集合类型 (Set) 是⼀个⽆序并唯⼀的键值集合。

127.0.0.1:6379> sadd myset v1 v2 v3
(integer) 0
127.0.0.1:6379> smembers myset
1) "v3"
2) "v1"
3) "v2"

集合类型的经典使⽤场景如下:

博客关注我的⼈和我关注的⼈都适合⽤集合存储,可以保证⼈员不会重复;

中奖⼈信息也适合用集合类型存储,这样可以保证⼀个⼈不会重复中奖。

有序集合类型

有序集合类型 (Sorted Set) 相⽐于集合类型多了⼀个排序属性 score(分值)。

SpringBoot 集成 Redis

添加 redis 依赖

image-20230702150700509

配置 redis

spring.redis.database=1
spring.redis.port=6379
spring.redis.host=8.130.106.169
spring.redis.password=i0qi8MRFNe144M8n

手动操作 redis

package com.example.redisdemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RedisController {
    @Autowired
    private RedisTemplate redisTemplate;
    @RequestMapping("/save")
    public String save(){
        redisTemplate.opsForValue().set("userinfo","zhangsan");
        return "ok";
    }
    @RequestMapping("/get")
    public Object get(){
        return redisTemplate.opsForValue().get("userinfo");
    }

    @RequestMapping("/save2")
    public String save2(){
        redisTemplate.opsForHash().put("myhash","username","lisi");
        return "ok";
    }
    @RequestMapping("/get2")
    public Object get2(){
        return redisTemplate.opsForHash().get("myhash","username");
    }
}

Spring Session 持久化

添加依赖

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

设置配置文件

spring.redis.database=2
spring.redis.host=8.130.106.169
spring.redis.password=i0qi8MRFNe144M8n
spring.redis.port=6379
spring.session.store-type=redis
spring.session.redis.flush-mode=on_save
server.servlet.session.timeout=1800
spring.session.redis.namespace=spring:session

存储和读取 session

package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/user")
public class UserController {
    private static final String SESSION_KEY_USERINFO = "SESSION_KEY_USERINFO";
    @RequestMapping("/save")
    public String save(HttpSession session){
        session.setAttribute(SESSION_KEY_USERINFO,"zhangsan");
        return "ok";
    }
    @RequestMapping("/get")
    public Object get(HttpServletRequest request){
        HttpSession session = request.getSession();
        if(session != null && session.getAttribute(SESSION_KEY_USERINFO)!=null){
            return session.getAttribute(SESSION_KEY_USERINFO);
        }
        return "null";
    }
}
  • 序列化出错案例
package com.example.demo.entity;

import lombok.Data;

@Data
public class UserInfo {
    private int id;
    private String username;
    private int age;
}
package com.example.demo.controller;

import com.example.demo.entity.UserInfo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/user")
public class UserController {
    private static final String SESSION_KEY_USERINFO = "SESSION_KEY_USERINFO";
    @RequestMapping("/save")
    public String save(HttpSession session){
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhangsan");
        userInfo.setAge(18);
        userInfo.setId(1);
        session.setAttribute(SESSION_KEY_USERINFO,userInfo);
        return "ok";
    }
    @RequestMapping("/get")
    public Object get(HttpServletRequest request){
        HttpSession session = request.getSession();
        if(session != null && session.getAttribute(SESSION_KEY_USERINFO)!=null){
            return session.getAttribute(SESSION_KEY_USERINFO);
        }
        return "null";
    }
}

image-20230702170058716

  • 解决方案:

image-20230702170308219

transient 可以设置敏感信息,不显示。

package com.example.demo.entity;

import lombok.Data;

import java.io.Serializable;

@Data
public class UserInfo implements Serializable {
    private static String serialVersionUID= "1";
    private int id;
    private String username;
    private transient int age;
}

image-20230702170943773

持久化

所谓的持久化就是将数据从内存保存到磁盘的过程,它的⽬的就是为了防⽌数据丢失。

Redis 持久化的⽅式有以下 3 种:

快照⽅式(RDB, Redis DataBase)将某⼀个时刻的内存数据,以⼆进制的⽅式写⼊磁盘;

⽂件追加⽅式(AOF, Append Only File),记录所有的操作命令,并以⽂本的形式追加到⽂件 中;

混合持久化⽅式:Redis 4.0 之后新增的⽅式,混合持久化是结合了 RDB 和 AOF 的优点,在写⼊ 的时候,先把当前的数据以 RDB 的形式写⼊⽂件的开头,再将后续的操作命令以 AOF 的格式存⼊ ⽂件,这样既能保证 Redis 重启时的速度,⼜能减低数据丢失的⻛险。

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

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

相关文章

el-checkbox / el-checkbox-group中绑定对象无法回显的问题处理

在使用el-checkbox / el-checkbox-group时&#xff0c;发现若label绑定的是对象&#xff0c;则是无法回显的&#xff0c;参考了很多方法&#xff0c;但大多都无法解决&#xff0c;最终参考下面的方法解决&#xff0c;记录一下。 <el-checkbox :label"JSON.stringify(i…

每天一点Python——day51

#第五十一天列表和字典为可变序列&#xff0c;元组是不可变序列 为什么要将元组设计成不可变序列呢&#xff1f; 一旦创建了不可变类型的对象&#xff0c;对象内部的所有数据将不能被修改 这样就避免了由于修改数据而导致的错误 对于不可变对象&#xff0c;在多任务环境下&…

最小覆盖串双指针解题思路及Java实现

最小覆盖串双指针解题思路及Java实现 题目双指针思路Java实现 题目 题目来自牛客NC28 最小覆盖子串 给出两个字符串 s 和 t&#xff0c;要求在 s 中找出最短的包含 t 中所有字符的连续子串。 例如&#xff1a; 输入&#xff1a;“XDOYEZODEYXNZ”,“XYZ” 返回值&#xff1a;“…

使用LiteSpeed缓存插件将WordPress优化到100%的得分

页面速度优化应该是每个网站所有者的首要任务&#xff0c;因为它直接影响WordPress SEO。此外&#xff0c;网站加载的时间越长&#xff0c;其跳出率就越高。这可能会阻止您产生转化并为您的网站带来流量。 使用正确的工具和配置&#xff0c;缓存您的网站可以显着提高其性能。因…

c++——命名空间

1.什么是命名空间 1.1命名空间的定义 命名空间&#xff08;Namespace&#xff09;是C中用来避免命名冲突的一种机制。命名空间可以将一组相关的函数、类、变量等定义在同一个逻辑分组中&#xff0c;从而避免它们与其他代码中的同名实体发生冲突。 C中&#xff0c;命名空间使用…

Openlayers实战:回显点、线段、圆形、多边形

Openlayers地图中,回显数据到地图上,形成几何图形是非常重要的一部分学习内容。 回显的内容基本单元包括点、线、圆形、多边形。本实战项目中,根据给定的坐标点,用最基础最管用的方式来显示这些信息。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑…

Keil环境下CANopenNode移植到STM32问题记录(一)---printf重定向问题

文章目录 问题描述问题结决思考&#xff1a;相关文章 在直接将CANopenSTM32的示例工程直接移植到Keil环境下。 如果移植工程未实现printf函数重定向&#xff0c;则要注释掉log_printf下面的printf函数&#xff0c;使日志打印失效 /* Printf function of CanOpen app */ #define…

Django_环境配置(一)

目录 一、安装Django 二、创建项目 三、创建应用 四、注册应用 五、使用mysql数据库 六、视图 七、开发服务器 源码等资料获取方法 一、安装Django # 在CMD中运行 pip install django # 查看djangp版本 python manage.py version 二、创建项目 # 在CMD中运行 django-a…

工业物联网安全监测解决方案:工业安全节能管理

工业自动化和工业化的快速发展&#xff0c;工厂安全问题越来越受到重视。工厂安全监测是保障工厂安全运行的关键技术之一&#xff0c;它可以及时发现并处理潜在的安全问题&#xff0c;防止事故的发生&#xff0c;保障员工的安全和工厂的正常运转。智能改造成为广大企业关注的热…

idea配置本地maven保姆级教程

一、说在前面 idea默认会带有maven插件&#xff0c;原则上是可以不需要配置的。但有个缺点&#xff0c;他是把本地仓库直接安装在了系统盘里面&#xff0c;随着时间的推移&#xff0c;仓库越来越大&#xff0c;笔记本的压力会比较大。 本文是下载自己的maven包&#xff0c;集…

DAY41:动态规划(一)动态规划理论基础

文章目录 DP概念以及和贪心的区别动规问题分类基础问题背包问题打家劫舍股票问题子序列问题 DP注意点解题步骤&#xff1a;五步debug考虑方向 视频课程&#xff1a;从此再也不怕动态规划了&#xff0c;动态规划解题方法论大曝光 &#xff01;| 理论基础 |力扣刷题总结| 动态规划…

3.1.cuda运行API-概述

目录 前言1. Runtime API概述总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习精简 CUDA 教程-Runtime API 概述 课程大纲可…

MachineLearningWu_3_LinearRegression

3 Linear Regression Linear Regression即是根据数据做出预测&#xff0c;如下&#xff0c; training set 如下&#xff1a; 在Linear Regression中你可以将(x&#xff0c; y)看做如下&#xff0c;每一行是一个sample&#xff0c;而每一列除最后一列是一个feature&#xff0c…

ESP32(掌控板) RGB灯控制

ESP32&#xff08;掌控板&#xff09; RGB灯控制 本程序实现了RGB灯亮度和颜色调节&#xff0c;通过触摸按键分别调节RGB值&#xff0c;通过机械按键选择要调节的灯或使用预设均通过调整变量的值加上判断实现。预设包含随机颜色和流水灯&#xff0c;各有高亮度和低亮度两种版本…

《Kali渗透基础》07. 弱点扫描(一)

kali渗透 1&#xff1a;漏洞发现1.1&#xff1a;Exploit-DB1.2&#xff1a;searchsploit1.3&#xff1a;nmap 2&#xff1a;漏洞管理3&#xff1a;弱点扫描类型4&#xff1a;漏洞基本概念4.1&#xff1a;CVSS4.2&#xff1a;CVE4.3&#xff1a;OVAL4.4&#xff1a;CCE4.5&#…

TCP概念

文章目录 1.TCP1.1 为什么需要 TCP 协议&#xff1f;TCP 工作在哪一层&#xff1f;1.2 什么是 TCP &#xff1f;1.3 什么是 TCP 连接&#xff1f;1.4 如何唯一确定一个 TCP 连接&#xff1f;1.5 有一个 IP 的服务器监听了一个端口&#xff0c;它的 TCP 的最大连接数是多少&…

nginx的权限问题(13: Permission denied)解决办法

1、查看nginx启动用户和使用用户是否一致 ps aux | grep nginx 如图&#xff1a; 一个是www,一个是root用户 2、打开nginx配置文件 打开 nginx.conf 文件 查找nginx.conf的位置 ps -aux | grep nginx 3、把 nginx 改为 root 4、重启nginx服务 service nginx restart …

性能监控平台 | Prometheus+InfluxDB + Grafana!

在本文中&#xff0c;我将把几个常用的监控部分给梳理一下。前面我们提到过&#xff0c;在性能监控图谱中&#xff0c;有操作系统、应用服务器、中间件、队列、缓存、数据库、网络、前端、负载均衡、Web 服务器、存储、代码等很多需要监控的点。显然这些监控点不能在一个专栏中…

USG6000V 防火墙的策略应用

将G1/0/0划入TRUST区 firewall zone trustadd interface GigabitEthernet1/0/0 将G1/0/1划入UNTRUST区 firewall zone untrustadd interface GigabitEthernet1/0/1在防火墙上配置放行策略 security-policyrule name 1source-zone trustdestination-zone localdestination-z…

2023年船舶、海洋与海事工程国际会议(NAOME 2023) | Ei Scopus双检索

会议简介 Brief Introduction 2023年船舶、海洋与海事工程国际会议(NAOME 2023) 会议时间&#xff1a;2023年10月20日-22日 召开地点&#xff1a;中国镇江 大会官网&#xff1a;NAOME 2023-2023 International Conference on Naval Architecture and Ocean & Marine Engine…