Redis从入门再再到入门(下)

news2024/11/15 4:30:04

文章目录

    • 1.Redis远程连接
      • 1.1 Redis远程连接配置
      • 1.2 通过桌面版图形化界面连接Redis
      • 1.3 通过IDEA中的插件连接Redis
    • 2.Jedis的基本使用
      • 2.1 jedis概述
      • 2.2 jedis的基本操作
      • 2.3 jedis连接池
    • 3.Spring整合Redis
      • 3.1 新建maven工程,引入相关依赖
      • 3.2 redis.properties
      • 3.3 spring-redis.xml
      • 3.4 Redis工具类Redisutils
      • 3.5 测试RedisUtils

1.Redis远程连接

1.1 Redis远程连接配置

修改redis配置文件

vim /home/redis-6.2.9/redis.conf 

image-20240830160709678

image-20240830160757950

重启服务

./redis-cli -a 123456 shutdown
./redis-server /home/redis-6.2.9/redis.conf 

image-20240830161021435

如果开启防火墙,需要通过执行以下命令,开放6379端口

firewall-cmd --zone=public --add-port=6379/tcp --permanent

systemctl restart firewalld.service

firewall-cmd --reload

1.2 通过桌面版图形化界面连接Redis

使用2019.5版的redis-desktop-manager,因为这个是免费版本,最新的版本需要收费

1725006148804

select id:切换到No.id的库

1.3 通过IDEA中的插件连接Redis

有收费的和免费的。遵循性价比原则,优先选择免费的使用,毕竟现在还在学习阶段。如果后期有需求的话,再做考虑。(当然免费的插件相比于收费的插件,功能会有所欠缺)

如果不想使用插件,完全可以使用redis-desktop-manager桌面版图形化工具

1725007182125

安装完成之后,会在右侧工具栏显示工具图标

image-20240830164311536

如果没有显示的话,可以选择View -> Tool Windows -> Redis Helper进行显示

image-20240830164434769

将所有信息填写好之后,点击TEST CONNECTION,收到Succeeded表示连接成功后,再点击OK

image-20240830164838175

image-20240830165007680

2.Jedis的基本使用

2.1 jedis概述

Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。 在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。java操作redis的第三方类库:jedis、

2.2 jedis的基本操作

引入依赖

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <!-- jedis相关依赖 -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
    </dependency>

</dependencies>
方法解释
new Jedis(host, port)创建jedis对象,参数host是redis服务器地址,参数port是redis服务端口
set(key, value)设置字符串类型的数据
get(key)获得字符串类型的数据
hset(key, filed, value)设置哈希类型的数据
hget(key, filed)获得哈希类型的数据
lpush(key, values)设置列表类型的数据
lpop(key)列表左面弹栈
rpop(key)列表右面弹栈
del(key)删除指定的key
/**
 * jedis中的方法名和redis中的命令是对应的
 */
public class JedisDemo01 {
    private Jedis jedis;

    @Before
    public void init() {
        // 1.通过jedis的构造方法设置连接参数
        jedis = new Jedis("192.168.x.x", 6379);
        // 2.设置连接密码
        jedis.auth("123456");
        // 3.选择索引为2的数据库,默认操作索引为0的数据库
        jedis.select(2);
    }

    /**
     * 存取set类型
     */
    @Test
    public void test01() {

        // 4.存入String类型的数据
        jedis.set("name", "Satellite");
        // 5.取出key为name的value
        System.out.println(jedis.get("name"));


    }

    /**
     * 存取hash类型
     */
    @Test
    public void test02() {

        // 4.存入hash类型的数据
        jedis.hset("1班", "20101515131", "张三");
        jedis.hset("1班", "20101515142", "李四");
        jedis.hset("2班", "20101515241", "王五");

        // 5.取出key为1班的value
        System.out.println(jedis.hget("2班", "20101515241"));
        jedis.hgetAll("1班").forEach((k, v) -> System.out.println(k + " " + v));


    }

    /**
     * 存取list类型
     */
    @Test
    public void test03() {

        // 4.存入hash类型的数据
        jedis.lpush("myList", "a", "b", "c", "d");

        // 5.取出key为myList的value
        jedis.lrange("myList", 0, -1).forEach(System.out::println);

    }

    /**
     * 存取去重set类型
     */
    @Test
    public void test04() {
        // jedis.del("mySet");
        jedis.sadd("mySet", "Satellite", "Planet", "Wang", "Wang");
        jedis.smembers("mySet").forEach(System.out::println);
    }

    @After
    public void release() {
        // 6.释放资源
        jedis.close();
    }
}

2.3 jedis连接池

jedis连接资源的创建与销毁是很消耗程序性能,所以jedis为我们提供了jedis的池化技术,jedisPool在创建时初始化一些连接资源存储到连接池中,使用jedis连接资源时不需要创建,而是从连接池中获取一个资源进行redis的操作,使用完毕后,不需要销毁该jedis连接资源,而是将该资源归还给连接池,供其他请求使用

参数名含义
blockWhenExhausted连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
evictionPolicyClassName设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大
空闲时间,或连接数超过最大空闲连接数)
lifo是否启用后进先出, 默认true
maxIdle最大空闲连接数, 默认8个
maxTotal最大连接数, 默认8个
maxWaitMillis获取连接时的最大等待毫秒数(如果设置为阻塞时
BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1
minEvictableIdleTimeMillis逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
minIdle最小空闲连接数, 默认0
testOnBorrow在获取连接的时候检查有效性, 默认false
package jedis;

import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 通过JedisPool连接redis,提高连接效率
 */
public class JedisPoolDemo02 {

    @Test
    public void test01() {
        // 1.初始化连接池相关配置
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(20);
        jedisPoolConfig.setMaxIdle(5);

        // 2.使用连接池的配置,初始化连接池
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.170.140", 6379, 1000, "123456");
        // 3.获取jedis对象,来操作redis
        Jedis jedisPoolResource = jedisPool.getResource();
        // 4.通过jedis对象操作redis
        jedisPoolResource.set("gender", "female");
        System.out.println(jedisPoolResource.get("gender"));
        // 5.释放资源
        jedisPoolResource.close();
        jedisPool.close();
    }
}

3.Spring整合Redis

3.1 新建maven工程,引入相关依赖

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>

        <!-- 引入spring相关依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.3.20</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.20</version>
        </dependency>

        <!-- 引入jedis相关依赖 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

        <!-- 引入spring-data-redis相关依赖 -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.8.14.RELEASE</version>
        </dependency>

        <!-- 日志相关的依赖 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.36</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.36</version>
        </dependency>
    </dependencies>

3.2 redis.properties

# redis连接参数
redis.host=192.168.x.x
redis.port=6379
redis.password=123456
redis.dbIndex=3 
# jedisPool相关参数
redis.maxTotal=20
redis.maxIdle=5
redis.timeout=10000

3.3 spring-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置注解扫描器 -->
    <context:component-scan base-package="io.redis"/>

    <!-- 加载redis.properties配置文件 -->
    <context:property-placeholder location="classpath:redis.properties"/>

    <!-- 配置JedisPoolConfig -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="${redis.maxTotal}"/>
        <property name="maxIdle" value="${redis.maxIdle}"/>
    </bean>

    <!-- 配置JedisConnectionFactory -->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <!-- 注入redis相关配置 -->
        <property name="hostName" value="${redis.host}"/>
        <property name="port" value="${redis.port}"/>
        <property name="password" value="${redis.password}"/>
        <property name="database" value="${redis.dbIndex}"/>
        <property name="timeout" value="${redis.timeout}"/>
        <!-- 注入连接池配置 -->
        <property name="poolConfig" ref="jedisPoolConfig"/>
    </bean>

    <!-- 配置redis操作模板RedisTemplate,通过这个模板操作redis数据库 -->
    <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>

        <!-- 指定序列化器,解决redis中key乱码问题 -->
        <property name="keySerializer" ref="stringRedisSerializer"/>
        <property name="valueSerializer" ref="stringRedisSerializer"/>
        <property name="hashKeySerializer" ref="stringRedisSerializer"/>
        <property name="hashValueSerializer" ref="stringRedisSerializer"/>
    </bean>

</beans>

3.4 Redis工具类Redisutils

package io.redis.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

/**
 * Redis工具类,为了方便操作redis
 */
@Component
public class RedisUtils {

    @Autowired
    RedisTemplate<String, Object> redisTemplate;

    /**
     * 向redis中存入string类型数据
     *
     * @param key
     * @param value
     * @return
     */
    public boolean set(String key, Object value) {
        try {
            redisTemplate.opsForValue().set(key, value);

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 根据key取出redis中的string数据
     *
     * @param key
     * @return
     */
    public Object get(String key) {
        return StringUtils.isEmpty(key) ? null : redisTemplate.opsForValue().get(key);
    }

    /**
     * 向redis中存入hash类型数据
     *
     * @param key
     * @param field
     * @param value
     * @return
     */
    public boolean hset(String key, Object field, Object value) {
        try {
            redisTemplate.opsForHash().put(key, field, value);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 根据key和filed取出redis中的hash数据
     *
     * @param key
     * @return
     */
    public Object hget(String key, Object filed) {
        return StringUtils.isEmpty(key) ? null : redisTemplate.opsForHash().get(key, filed);
    }

    /**
     * 通用方法:根据key删除redis中对应的数据
     *
     * @param key
     * @return
     */
    public boolean del(String key) {
        try {
            redisTemplate.delete(key);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 通用方法:判断key是否存在
     *
     * @param key
     * @return
     */
    public boolean exist(String key) {
        try {
            return redisTemplate.hasKey(key);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

    }

    /**
     * 为某个key设置过期时间
     *
     * @param key
     * @param timeout
     * @return
     */
    public boolean expire(String key, long timeout) {
        try {

            return redisTemplate.expire(key, timeout, TimeUnit.SECONDS);


        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 查看key的剩余存活时间
     *
     * @return
     */
    public long ttl(String key) {
        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
    }

}

3.5 测试RedisUtils

package io.redis.utils;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

import static org.junit.jupiter.api.Assertions.*;

@SpringJUnitConfig(locations = "classpath:spring-redis.xml")
class RedisUtilsTest {
    @Autowired
    RedisUtils redisUtils;

    @Test
    void set() {
        redisUtils.set("name", "Satelite");
    }

    @Test
    void get() {
        System.out.println(redisUtils.get("name"));
    }

}

image-20240831183803691

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

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

相关文章

Python | Leetcode Python题解之第387题字符串中的第一个唯一字符

题目&#xff1a; 题解&#xff1a; class Solution:def firstUniqChar(self, s: str) -> int:position dict()q collections.deque()n len(s)for i, ch in enumerate(s):if ch not in position:position[ch] iq.append((s[i], i))else:position[ch] -1while q and po…

如何开发针对不平衡分类的成本敏感神经网络 python

如何开发针对不平衡分类的成本敏感神经网络 深度学习神经网络是一类灵活的机器学习算法&#xff0c;可以在各种问题上表现良好。 神经网络使用误差反向传播算法进行训练&#xff0c;该算法涉及计算模型在训练数据集上产生的误差&#xff0c;并根据这些误差的比例更新模型权重…

鸿蒙开发入门day16-拖拽事件和手势事件

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;还请三连支持一波哇ヾ(&#xff20;^∇^&#xff20;)ノ&#xff09; 目录 拖拽事件 概述 拖拽流程 ​手势拖拽 ​鼠标拖拽 拖拽背板图 …

如何有效防止表单重复提交

如何有效防止表单重复提交 1. 使用重定向&#xff08;Redirect&#xff09;2. 点击后按钮失效3. Loading 遮罩4. 自定义重复提交过滤器 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Web开发中&#xff0c;表单重复提交是一个常见问题&…

计算物理精解【3】

文章目录 力学单位矢量基础定义 矢量加法矢量加法的几何方法矢量加法的代数方法示例注意事项 矢量间的关系矢量&#xff08;或向量&#xff09;的标量积&#xff08;也称为点积、内积或数量积&#xff09;性质计算两矢量之间的夹角例子步骤数值结果 计算两三维矢量之间夹角的例…

厨房老鼠检测算法解决方案老鼠检测算法源码样本详细介绍

厨房老鼠检测算法是一种创新的解决方案&#xff0c;它结合了机器学习和图像识别技术。通过使用高精度的传感器和智能摄像头&#xff0c;这些算法可以实时监控厨房环境&#xff0c;并检测到老鼠的活动痕迹。与传统的检测方法相比&#xff0c;这种算法具有更高的灵敏度和准确性&a…

Java对象的访问定位技术

Java虚拟机规范中规定reference类型是一个指向对象的引用&#xff0c;但规定并没有定义这个引用应该通过什么方式去定位、访问堆中的对象的具体位置&#xff0c;所以对象访问方式取决于具体的虚拟机实现。 目前主流的访问方式有两种&#xff1a;使用句柄和直接指针。 使用句柄…

Altium designer设计经验谈——常用规则的使用(二)

文章目录 前言三、规则设置介绍——走线规则1、Routing——>Width 线宽2、Routing——>Topology 拓扑 四、规则设置介绍——平面层规则1、Plane——>电源层连接样式 Power Plane Connect Style2、Plane——>电源层间距距离 Power Plane Clearance3、Plane——>多…

单片机编程魔法师-并行多任务程序

程序架构 程序代码 小结 数码分离&#xff0c;本质上就是将数据和代码逻辑进行分离&#xff0c;跟第一章使用数据驱动程序一样的道理。 不过这里不同之处在于。这里使用通过任务线程&#xff0c;但是却有2个任务在运行&#xff0c;两个任务都通过先初始化任务数据参数&#x…

C++ | Leetcode C++题解之第387题字符串中的第一个唯一字符

题目&#xff1a; 题解&#xff1a; class Solution { public:int firstUniqChar(string s) {unordered_map<char, int> position;queue<pair<char, int>> q;int n s.size();for (int i 0; i < n; i) {if (!position.count(s[i])) {position[s[i]] i;…

设备管理与文件系统

1、设备管理框架 对于不同类型的设备的操作&#xff0c;全部由一下函数指针来完成。即操作系统对设备进行操作&#xff0c;只需要调用统一的API接口&#xff0c;无需了解相关的细节。 比如如下的接口设计&#xff1a; int (*open) (device_t * dev) ; int (*read) (device_t …

直播行业的未来:南昌络喆科技有限公司的创新无人直播项目!

随着数字化时代的推进&#xff0c;直播行业迎来了前所未有的增长机遇。南昌络喆科技有限公司凭借其创新的无人直播技术&#xff0c;正引领着行业的新潮流&#xff0c;展现出直播领域的新面貌。 无人直播技术突破了传统直播的局限&#xff0c;实现了自动化的高效运营模式。它摒弃…

用Python解决预测问题_对数线性模型模板

对数线性模型&#xff08;Log-linear model&#xff09;是统计学中用于分析计数数据或频率数据的一类模型&#xff0c;特别是在多维列联表&#xff08;contingency tables&#xff09;分析中非常常见。这种模型通过取对数将乘法关系转换为加法关系&#xff0c;从而简化了数据分…

关于自己部署AI大模型踩的坑(三)—— 部署

最近一直在研究如何打算属于我自己的J.A.R.V.I.S.&#xff08;钢铁侠中的机器人管家&#xff09;。 上一篇写了我最近在部署自己的大模型&#xff0c;使用llama3.1&#xff0c; 和通义千问2。虽然最终结果也是成功了&#xff0c;过程却十分地坎坷。所以这一篇文章一是总结其中遇…

Nginx快速入门:编译及常用配置

Nginx 是一个高性能的 HTTP 服务器和反向代理服务器&#xff0c;也是一个 IMAP/POP3 邮件代理服务器。它以其高并发处理能力和低资源消耗而闻名&#xff0c;能够同时处理数千个连接。 Nginx 的主要功能包括&#xff1a; 静态资源服务器&#xff1a;Nginx 可以担任静态资源服务…

【Python零基础】Python测试

文章目录 前言一、使用pip安装pytest1.1 更新pip1.2 安装pytest 二、测试函数2.1 编写测试文件2.2 运行测试2.3 测试不通过2.4 测试不通过2.4 增加新测试 三、测试类3.1 断言3.2 夹具 总结 前言 代码测试是程序开发中极其重要的一环&#xff0c;任何代码都应该经过测试才能上生…

sqli-labs靶场通关攻略(五十一到五十六关)

sqli-labs-master靶场第五十一关 步骤一&#xff0c;尝试输入?sort1 我们发现这关可以报错注入 步骤二&#xff0c;爆库名 ?sort1 and updatexml(1,concat(0x7e,database(),0x7e),1)-- 步骤三&#xff0c;爆表名 ?sort1 and updatexml(1,concat(0x7e,(select group_conc…

数据结构:树形结构(树、堆)详解

数据结构&#xff1a;树形结构&#xff08;树、堆&#xff09;详解 一、树&#xff08;一&#xff09;树的性质&#xff08;二&#xff09;树的种类二叉树多叉树满N叉树完全N叉树 &#xff08;三&#xff09;二叉树的实现1、二叉树结构定义2、二叉树功能实现&#xff08;1&…

数字化转型中的数据应用:挑战、机遇与追赶之路

在数字化时代的大潮中&#xff0c;数据已悄然从企业的边缘资源跃升为最宝贵的核心资产。然而&#xff0c;这场数据盛宴并未带来普遍的数据应用成熟&#xff0c;反而揭示了企业在数据利用上的巨大鸿沟。即便是全球500强企业&#xff0c;在数据应用的征途上&#xff0c;也仅仅是比…

秋招突击——笔试总结——8/31——京东笔试

文章目录 引言正文第一题——下一个字典序的字符个人实现 第二题——冒泡排序的变种个人实现空间复杂度比较低的版本 第三题——两人走路个人实现 总结 引言 今天京东笔试做的并不好&#xff0c;有很多问题的关窍都没有找到&#xff0c;所以在很多问题上都浪费了大量的时间&am…