【redis笔记】

news2025/6/16 10:37:59

Redis简介

安装步骤

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

字符串string

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

哈希hash 适合存储对象

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

列表list 按照插入顺序排序,可以有重复元素

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

集合set 无序集合,没有重复元素

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有序集合sorted set 有序集合,没有重复元素

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Redis常用通用命令,任何类型都可以使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

keys * :查看所有的key

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ttl name:如果返回-1,说明存活时间是永久的

在java种操作redis

使用客户端Jedis

jedis的maven坐标

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.8.0</version>
</dependency>

使用jedis操作redis的步骤:

①获取链接

②执行操作

③关闭链接

import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;

import java.util.Set;

public class TestRedis {
    @Test
    public void test01(){
//        1获取链接
        Jedis jedis = new Jedis("localhost", 6379);


//        2执行具体的操作
        jedis.set("username","xiaoming");
        String username = jedis.get("username");
        System.out.println(username);

        jedis.del(username);

        String s = jedis.get(username);
        System.out.println(s);

        jedis.hset("hset1","value","1");
        String hget = jedis.hget("hset1", "value");
        System.out.println(hget);

        Set<String> keys = jedis.keys("*");
        for(String key:keys){
            System.out.println(key);
        }
//        3关闭连接
        jedis.close();
    }
}

在Java种操作redis进阶

使用spring data redis

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

redis相关配置
spring:
  application:
    #应用的名称,可选
    name: reggie_take_out
  redis:
    host: localhost
    prot: 6379
    #password: 123456
    #默认是0号数据库 换数据库命令  select 1 进入1号数据库
    #最多有16个数据库
    database: 0
    jedis:
#      redis连接池配置
      pool:
        max-active: 8
        max-wait: 1ms
        max-idle: 4
        min-idle: 0

导入依赖包

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

改变序列化方式

提供配置类

package com.xue.reggie.config;

import org.springframework.cache.annotation.CachingConfigurerSupport;
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
public class RedisConfig extends CachingConfigurerSupport {
    public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

//        默认的key序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
//        把hash的field的序列化也改成string
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        redisTemplate.setConnectionFactory(connectionFactory);

        return redisTemplate;

    }
}

使用

import com.xue.reggie.ReggieApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;
import org.springframework.test.context.junit4.SpringRunner;
import redis.clients.jedis.Jedis;

import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@SpringBootTest(classes = ReggieApplication.class)
//测试启动器
@RunWith(SpringRunner.class)
public class TestRedis {

    @Resource
    private RedisTemplate redisTemplate;

    @Test
    public void test01(){
//        1获取链接
        Jedis jedis = new Jedis("localhost", 6379);


//        2执行具体的操作
        jedis.set("username","xiaoming");
        String username = jedis.get("username");
        System.out.println(username);

        jedis.del(username);

        String s = jedis.get(username);
        System.out.println(s);

        jedis.hset("hset1","value","1");
        String hget = jedis.hget("hset1", "value");
        System.out.println(hget);

        Set<String> keys = jedis.keys("*");
        for(String key:keys){
            System.out.println(key);
        }
//        3关闭连接
        jedis.close();
    }

    /**
     * 操作普通string
     */
    @Test
    public void test02(){
//        普通
        ValueOperations valueOperations = redisTemplate.opsForValue();

//        set 无序不重复
        SetOperations setOperations = redisTemplate.opsForSet();
//        有序 可重复
        ListOperations listOperations = redisTemplate.opsForList();
//        有序 不可重复
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        valueOperations.set("city","beijing");
        String city = (String)valueOperations.get("city");

//        设置只存在10秒钟
        valueOperations.set("k1","value1",10l, TimeUnit.SECONDS);
        System.out.println(city);

        Boolean b = valueOperations.setIfAbsent("city", "1234");
        System.out.println(b);
//        此时输出false,证明redis里面已经有“city”这个key了,虽然值不一样把

    }
    /**
     * 操作hash
     */
    @Test
    public void test03(){
        //        哈希 key-feild-value
//        存值
        HashOperations hashOperations = redisTemplate.opsForHash();
        hashOperations.put("key1","hashkey1","value1");
        hashOperations.put("key1","hashkey2","value2");

//        取值
        String o = (String) hashOperations.get("key1", "hashkey1");
        System.out.println(o);

//        获得hash结构种的所有字段
        Set keys = hashOperations.keys("key1");
        for (Object key : keys) {
            System.out.println(key);
        }
//        获得hash结构种的所有值  返回值是List
        List values = hashOperations.values("key1");
        for (Object value : values) {
            System.out.println(value);
        }
    }
    /**
     * 操作list
     */
    @Test
    public void test04(){
        ListOperations listOperations = redisTemplate.opsForList();
        listOperations.leftPushAll("mylist","a","b","v");

//        取值
        List<String> mylist = listOperations.range("mylist", 0, -1);
        for (String o : mylist) {
            System.out.println(o);//v b a
        }

        Object o = listOperations.leftPop("mylist");
        System.out.println(o);

//        获得列表长度len
        Long mylist1 = listOperations.size("mylist");
        int llist = mylist1.intValue();
        for (int i = 0; i < llist; i++) {
            String mylist2 =(String) listOperations.rightPop("mylist");
            System.out.println(mylist2);
        }

    }

    /**
     * set类型的数据
     */
    @Test
    public void test05(){
        SetOperations setOperations = redisTemplate.opsForSet();
        setOperations.add("myset","a","b","c","a");
//        取值
        Set myset = setOperations.members("myset");
        for (Object o : myset) {
            System.out.println(o);
        }

//        删除成员
        Long remove = setOperations.remove("myset", "a");
        System.out.println(remove);
    }
    /**
     * 操作zset
     */
    @Test
    public void test06(){
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
        zSetOperations.add("myzset","a",10.0);
        zSetOperations.add("myzset","b",12.0);
        zSetOperations.add("myzset","a",11.0);

        Set<String> myzset = zSetOperations.range("myzset", 0, -1);
        for (String s : myzset) {
            System.out.println(s);
        }

//        修改分数
        zSetOperations.incrementScore("myset","b",-5.0);

        zSetOperations.remove("myset","a");

    }
        /**
     * 通用操作
     */
    @Test
    public void testCommon(){
        Set<String> keys = redisTemplate.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }
//判断是否存在
        Boolean myset = redisTemplate.hasKey("myset");
//        删除指定的key
        redisTemplate.delete("myset");
//        获取指定key对应的value的数据类型
        DataType myset1 = redisTemplate.type("myset");
        System.out.println(myset1);
    }
}
使用redis
1、RedisTemplate和StringRedisTemplate的区别

区别在于StringRedisTemplate只操作字符串,而RedisTemplate操作对象

  1. 两者的关系是StringRedisTemplate继承RedisTemplate。

  2. 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。

  3. SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate默认使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面

img

当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这都是根据序列化策略来决定的。

而stringredistemplate,默认存入的数据就是原文,因为stringRedistemplate默认使用的是string序列化策略,使用stringredistemplate默认存入数据长这个样:

img

2、setKeySerializer和setHashKeySerializer
  • setEnableDefaultSerializer(false);

    关闭redis默认序列化器

  • setKeySerializer();

    设置string字符串的key的序列化器

  • setValueSerializer();

    设置string字符串的value的序列化器

  • setStringSerializer();

    设置String的序列化器

  • setHashKeySerializer();

    设置hash的value的序列化器

  • setHashValueSerializer();

    设置hash的value的序列化器

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

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

相关文章

Gartner2023数据库魔力象限发布 阿里云依旧领导者 腾讯退出 EDB/Yugabyte进入

这是一个跨越数年的系列&#xff0c;历史文章参考&#xff1a; * 数据库魔力象限2022&#xff1a;阿里领先、腾讯再次进入 * 2021 藏在魔力象限中的数据库江湖 * Gartner云计算魔力象限2018 概述 Gartner云数据库魔力象限&#xff08;后简称“象限”或“MQ”&#xff09;一…

力扣日记12.23-【二叉树篇】501. 二叉搜索树中的众数

力扣日记&#xff1a;【二叉树篇】501. 二叉搜索树中的众数 日期&#xff1a;2023.12.23 参考&#xff1a;代码随想录、力扣 501. 二叉搜索树中的众数 题目描述 难度&#xff1a;简单 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出…

设计模式(4)--对象行为(2)--命令

1. 意图 将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请 求日志&#xff0c;以及支持可撤销的操作。 2. 四种角色 接收者(Receiver)、抽象命令(Command)、具体命令(Concrete Command)、请求者(Invoker) 3. 优点…

TCP_滑动窗口介绍

简介 TCP协议中有两个窗口&#xff0c;滑动窗口和拥塞窗口&#xff0c;两者均是一种流控机制&#xff1b;滑动窗口是接收方的流控机制&#xff0c;拥塞窗口是发送方的流控机制。 本文介绍滑动窗口&#xff0c;接收方为TCP连接设置了接收缓存。当TCP连接接收到正确、按序的字节…

idea运行tocmat报错

1.检查环境变量是否配置正确。 网上有许多配置tomcat环境变量的方法&#xff0c;这里不再赘述。 2.判断是否有该情况&#xff1a; 在tomcat的bin目录下有三个bat文件(startup.bat,shutdown.bat,catalina.bat)&#xff0c;随意双击一个&#xff0c;会报出上述错误。但是右键使…

JavaScript高级 函数进阶篇

函数进阶 1、函数的定义和调用 函数声明方式function关键字&#xff08;命名函数&#xff09;&#xff1b;函数表达式&#xff08;匿名函数&#xff09;&#xff1b;new Function()&#xff08;此处的Function()是一个构造函数&#xff09;&#xff1b;var fn new Function(参…

华为鸿蒙(HarmonyOS):连接一切,智慧无限

华为鸿蒙是一款全场景、分布式操作系统&#xff0c;旨在构建一个真正统一的硬件生态系统。该操作系统于2019年8月首次发布&#xff0c;并被设计为可以应用于各种设备&#xff0c;包括智能手机、智能手表、智能电视、车载系统等多种智能设备。 推荐一套最新版的鸿蒙4.0开发教程 …

【即插即用篇】YOLOv8改进实战 | 引入 Involution(内卷),用于视觉识别的新一代神经网络!涨点神器!

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8是一种尖端的、最先进的 (SOTA) 模型,它建立在以前成…

antdv中的slider组件会默认将min值传递给value

如果是使用响应式变量&#xff0c;会将min的值传递到v-model对应的变量里

with torch.no_grad()在Pytorch中的应用

with torch.no_grad()在Pytorch中的应用 参考&#xff1a; https://blog.csdn.net/qq_24761287/article/details/129773333 https://blog.csdn.net/sazass/article/details/116668755 在学习Pytorch时&#xff0c;老遇到 with torch.no_grad()&#xff0c;搞不清其作用&#…

Deployment Controller详解(下)

上一篇在《Deployment Controller详解&#xff08;上&#xff09;》中介绍了Deployment Controller 的创建、更新和回滚。了解了这三个功能&#xff0c;基本上也就懂得了大厂PaaS平台中服务的灰度升级、失败回滚等操作是如何实现的了。 接下来本文会介绍Deployment Controller…

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程

1.NVIDIA驱动检测及安装 1.1 查看显卡信息 # 显示系统中所有通过PCI总线连接的VGA兼容控制器信息。包括集成显卡即与CPU内置在同一块芯片上的显卡&#xff09;以及独立显卡。 lspci | grep VGA # 将显示有关系统中所有NVIDIA显卡的信息。 lspci | grep NVIDIA 解释&#xf…

【数据结构之顺序表】

数据结构学习笔记---002 数据结构之顺序表1、介绍线性表1.1、什么是线性表? 2、什么是顺序表?2.1、概念及结构2.2、顺序表的分类 3、顺序表接口的实现3.1、顺序表动态存储结构的Seqlist.h3.1.1、定义顺序表的动态存储结构3.1.2、声明顺序表各个接口的函数 3.2、顺序表动态存储…

智能优化算法应用:基于野马算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于野马算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于野马算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.野马算法4.实验参数设定5.算法结果6.参考文献7.MA…

国产AI大模型与ChatGPT的差距到底有多大?

据不完全统计&#xff0c;截止今年10月&#xff0c;中国已经发布了238个大模型。IDC预测&#xff0c;2026年中国人工智能软件及应用市场规模将达到211亿美元&#xff0c;人工智能将进入大规模落地应用关键期。 有报告分析发现&#xff0c;中国自2020年进入大模型加速发展期&am…

GPTs 官方榜单 Top10,第一个独属于中国传统文化的胜利

GPTs 发布已经快两个月了&#xff0c;很有可能成为下一阶段的 app 形态&#xff0c;现在已经有很多人在开发、使用 GPTs&#xff0c;最近官方数据也更新了使用量最多的 GPT&#xff0c;来看下中文榜单的 Top10&#xff1a; 排名标题创建者使用量1AI 算命Jerrold Bergnaum12100…

【智能家电】东胜物联离在线语音方案为厨电企业赋能,实现厨房智能化控制

近年来&#xff0c;我国厨电市场蓬勃发展。据行业统计数据显示&#xff0c;至今年6月&#xff0c;市场规模已达356亿元&#xff0c;同比增长8.8%。随着数字科技、物联网和人工智能的兴起&#xff0c;厨电产品正在朝着更智能、多功能化的方向迅速发展。 为此厨电厂商正在积极布…

开放原子线下训练营---STM32H7搭载TobudOS开发心得

导语&#xff1a; 本次线下活动是以STM32H7为核心的一个功能强大的开发板&#xff0c;不仅支持Audio&#xff0c;HDMI&#xff0c;还支持4G或者WiFi模块&#xff0c;也可以外接屏幕&#xff0c;本次线下训练营是以4G模块进行开发。 线下的实物开发板如下所示&#xff1a; 注意…

算法练习Day19 (Leetcode/Python-二叉树)

108. Convert Sorted Array to Binary Search Tree Given an integer array nums where the elements are sorted in ascending order, convert it to a height-balanced binary search tree. 思路&#xff1a; 一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的…

微软官方镜像下载大全(windows iso 官方镜像)

原本只是想下一个Windows Server 2022中文版的镜像&#xff0c;后面发现要么就是慢得一批的某盘&#xff0c;要么就是磁力&#xff0c;我想直接下载简简单单&#xff0c;找了一圈没有找到。官网下载需要注册、登录乱七八糟&#xff0c;最终终于找到下载方法了&#xff0c;适用于…