【redis笔记】

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的序列化器

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Android]CheckBox复选框

在Android开发中&#xff0c;复选框&#xff08;CheckBox&#xff09;是一种常用的控件&#xff0c;用于让用户在多个选项中进行选择。它通常用于表单中&#xff0c;让用户选择多个选项或者进行多项操作。在本篇博客中&#xff0c;我们将介绍如何在Android应用中使用CheckBox控…

Android MVI架构之UI状态的持有与保存

Android MVI架构之UI状态的持有与保存 我们将介绍状态持有者和其他与 UI 层相关的主题&#xff0c;例如在 Android 上提升状态和保存 UI 状态的位置。 状态持有者 状态持有者通过处理逻辑和/或公开 UI 状态来简化 UI。在本节中&#xff0c;我们将看到如何实现状态持有者以及…

Linux安装idea

目录 1.下载网址 2.解压安装 2.1新建idea安装路径 2.2解压压缩包到指定目录 2.3运行idea 3.下载Java环境 3.1命令行下载方式&#xff08;建议自行下载较新版本一步到位&#xff09; 3.2查看java版本 3.3版本不满意卸载当前jdk 3.4从官网下载较新的deb包进行下载 3.5解…

PyQt5设计一个简单的抽奖系统

PyQt5抽奖系统 程序运行截图 抽奖系统代码 该系统使用PyQt5模块以及openpyxl模块开发&#xff0c;需要使用pip安装导入PyQt5模块和openpyxl模块 import random, sys from PyQt5.QtWidgets import QWidget, QFormLayout, QLineEdit, QVBoxLayout, QApplication, QPushButton,…

Mysql 数据库APi 编程(c/c++)-1.0

MySQL数据库API库 访问MySQL服务器&#xff0c;这需要使用mysqlclient库&#xff0c;MySQL的大多数客户端API&#xff08;除Java和.NET&#xff09;都是通过这个库来和MySQL服务器通讯的&#xff0c;而这个库正是使用C语言编写的。 可使用mysql -V 命令查看当前系统内所使用的…

C# Onnx yolov8n csgo player detection

目录 效果 模型信息 项目 代码 下载 C# Onnx yolov8n csgo player detection 效果 模型信息 Model Properties ------------------------- date&#xff1a;2023-12-22T15:01:08.014205 author&#xff1a;Ultralytics task&#xff1a;detect license&#xff1a;AGPL-…

从0到1部署gitlab自动打包部署项目

本文重点在于配置ci/cd打包 使用的是docker desktop 第一步安装docker desktop Docker简介 Docker 就像一个盒子&#xff0c;里面可以装很多物件&#xff0c;如果需要某些物件&#xff0c;可以直接将该盒子拿走&#xff0c;而不需要从该盒子中一件一件的取。Docker中文社区、…

集合论:二元关系(1)

集合论这一章内容很多&#xff0c;重点是二元关系中关系矩阵&#xff0c;关系图和关系性质:自反、反自反、对称、反对称、传递以及关系闭包的运算&#xff0c;等价关系&#xff0c;偏序关系&#xff0c;哈斯图&#xff0c;真吓人&#xff01; 1.笛卡儿积 由两个元素x和y按照一…

Opencv计算机视觉的分类

传统的计算机视觉可以使用Opencv等Python库&#xff0c;对图像进行简单的操作&#xff0c;例如对图像缩放、滤波、阈值分割等等。对于计算机来说&#xff0c;一张彩色图片就是一个三通道的矩阵&#xff0c;分别对应红绿蓝&#xff08;RGB&#xff09;三种颜色&#xff0c;通过改…

计算机网络 应用层上 | 域名解析系统DNS 文件传输协议FTP,NFS 万维网URL HTTP HTML

文章目录 1 域名系统DNS1.1 域名vsIP&#xff1f;1.2 域名结构1.3 域名到IP的解析过程域名服务器类型 2 文件传送协议2.1 FTP 文件传输协议2.2 NFS 协议2.3 简单文件传送协议 TFTP 3 万维网WWW3.1 统一资源定位符URL3.2 超文本传送协议HTTP3.2.1 HTTP工作流程3.2.2 HTTP报文结构…

生物系统学中的进化树构建和分析R工具包V.PhyloMaker2的介绍和详细使用

V.PhyloMaker2是一个R语言的工具包&#xff0c;专门用于构建和分析生物系统学中的进化树&#xff08;也称为系统发育树或phylogenetic tree&#xff09;。以下是对V.PhyloMaker2的一些基本介绍和使用说明&#xff1a; 论文介绍&#xff1a;V.PhyloMaker2: An updated and enla…

混合精度训练(MAP)

一、介绍 使用精度低于32位浮点数的数字格式有很多好处。首先&#xff0c;它们需要更少的内存&#xff0c;可以训练和部署更大的神经网络。其次&#xff0c;它们需要更少的内存带宽&#xff0c;这加快了数据传输操作。第三&#xff0c;数学运算在降低精度的情况下运行得更快&a…

web架构师编辑器内容-创建业务组件和编辑器基本行为

编辑器主要分为三部分&#xff0c;左侧是组件模板库&#xff0c;中间是画布区域&#xff0c;右侧是面板设置区域。 左侧是预设各种组件模板进行添加 中间是使用交互手段来更新元素的值 右侧是使用表单的方式来更新元素的值。 大致效果&#xff1a; 左侧组件模板库 最初的模板…

博客引擎 Hexo 入门介绍+安装笔记

Hexo Hexo is a fast, simple & powerful blog framework. 一直使用的是 jekyll&#xff0c;文章越写越多&#xff0c;不太好管理。是时候换个博客尝试一下。 Prepare blog zh_CN 本机为 MAC。不同系统会略有不同&#xff0c;但是大同小异。 Node.js 必须。 作用&…

LLM之RAG实战(八)| 使用Neo4j和LlamaIndex实现多模态RAG

人工智能和大型语言模型领域正在迅速发展。一年前&#xff0c;没有人使用LLM来提高生产力。时至今日&#xff0c;很难想象我们大多数人或多或少都在使用LLM提供服务&#xff0c;从个人助手到文生图场景。由于大量的研究和兴趣&#xff0c;LLM每天都在变得越来越好、越来越聪明。…

网站使用https认证

随着网络的普及和依赖程度的增加&#xff0c;网站安全性问题也日益凸显。为了确保用户和网站之间的数据传输安全&#xff0c;采用HTTPS认证已经变得至关重要。 1.数据安全是首要任务 在互联网上&#xff0c;信息传输是网站运作的基础。然而&#xff0c;未加密的传输容易受到中…

计算机网络——计算机网络的概述(一)

前言&#xff1a; 面对马上的期末考试&#xff0c;也为了以后找工作&#xff0c;需要掌握更多的知识&#xff0c;而且我们现实生活中也已经离不开计算机&#xff0c;更离不开计算机网络&#xff0c;今天开始我们就对计算机网络的知识进行一个简单的学习与记录。 目录 一、什么…

案例136:基于微信小程序的公交信息在线查询系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

使用Velero备份、恢复k8s集群上的资源

一、Velero简介 Velero提供备份和恢复 Kubernetes 集群资源和持久卷的工具。 Velero功能&#xff1a; 对群集进行备份&#xff0c;并在丢失时进行还原。将集群资源迁移到其他集群。 Velero 包括&#xff1a; 在群集上运行的服务器在本地运行的命令行客户端 开源地址&…

【终极教程】Cocos2dx服务端重构(优化cocos2dx服务端)

文章目录 概述问题概述1. 代码混淆代码加密具体步骤测试和配置阶段IPA 重签名操作步骤2. 缺乏文档3. 缺乏推荐的最佳实践4. 性能问题 总结 概述 Cocos2dx是一个非常流行的跨平台游戏引擎&#xff0c;开发者可以使用这个引擎来开发iOS、Android和Web游戏。同时&#xff0c;Coco…