【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 {@Testpublic 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_outredis:host: localhostprot: 6379#password: 123456#默认是0号数据库 换数据库命令  select 1 进入1号数据库#最多有16个数据库database: 0jedis:
#      redis连接池配置pool:max-active: 8max-wait: 1msmax-idle: 4min-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序列化器为:JdkSerializationRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer());
//        把hash的field的序列化也改成stringredisTemplate.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 {@Resourceprivate RedisTemplate redisTemplate;@Testpublic 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*/@Testpublic 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*/@Testpublic 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结构种的所有值  返回值是ListList values = hashOperations.values("key1");for (Object value : values) {System.out.println(value);}}/*** 操作list*/@Testpublic 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);//        获得列表长度lenLong 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类型的数据*/@Testpublic 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*/@Testpublic 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");}/*** 通用操作*/@Testpublic void testCommon(){Set<String> keys = redisTemplate.keys("*");for (String key : keys) {System.out.println(key);}
//判断是否存在Boolean myset = redisTemplate.hasKey("myset");
//        删除指定的keyredisTemplate.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.hqwc.cn/news/294042.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot学习笔记(五)

MybatisPlus进阶 1.MybatisPlus一对多查询 2.分页查询 1.MybatisPlus一对多查询 场景&#xff1a;我有一个表&#xff0c;里面填写的是用户的个人信息&#xff08;姓名&#xff0c;生日&#xff0c;密码&#xff0c;用户ID&#xff09;。我还有一个表填写的订单信息&#x…

Leetcode—445.两数相加II【中等】

2023每日刷题&#xff08;六十七&#xff09; Leetcode—445.两数相加II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2…

《Python》面试常问:深拷贝、浅拷贝、赋值之间的关系(附可变与不可变)【用图文讲清楚!】

背景 想必大家面试或者平时学习经常遇到问python的深拷贝、浅拷贝和赋值之间的区别了吧&#xff1f;看网上的文章很多写的比较抽象&#xff0c;小白接收的难度有点大&#xff0c;于是乎也想自己整个文章出来供参考 可变与不可变 讲深拷贝和浅拷贝之前想讲讲什么是可变数据类型…

OPC UA 与PROFINET比较

ROFINET和OPC UA是两种常见的协议&#xff0c;过去这两个协议有两个不同的角色。PROFINET通常用于现场设备和本地控制器之间的实时数据通信。而OPC UA通常用于在本地控制器和更高级别的MES和SCADA系统之间进行通信。 OPC UA 网络架构 PROFINET网络由IO控制器和IO设备组成&…

任天堂,steam游戏机通过type-c给VR投屏与PD快速充电的方案 三type-c口投屏转接器

游戏手柄这个概念&#xff0c;最早要追溯到二十年前玩FC游戏的时候&#xff0c;那时候超级玛丽成为了许多人童年里难忘的回忆&#xff0c;虽然长大了才知道超级玛丽是翻译错误&#xff0c;应该是任天堂的超级马里奥&#xff0c;不过这并不影响大家对他的喜爱。 当时FC家用机手柄…

Java小案例-Bean是如何注入到Spring中的,有几种注入方式

前言 关于Bean注入Spring容器的方式网上也有很多相关文章&#xff0c;但是很多文章可能会存在以下常见的问题 注入方式总结的不全 没有分析可以使用这些注入方式背后的原因 没有这些注入方式在源码中的应用示例 ... 所以本文就带着解决上述的问题的目的来重新梳理一下Bea…

安装gnvm,nodejs,npm使用方法

安装gnvm,nodejs,npm使用方法 一、安装gnvm gnvm.exe下载地址&#xff1a; https://download.csdn.net/download/hsg77/88651752 http://ksria.com/gnvm/#download 二、配置gnvm环境变量 新建目录&#xff0c;如&#xff1a;d:/nodejs 并把gnvm.exe存储到此目录 并把d:/node…

python 用OpenCV 将图片转视频

import os import cv2 import numpy as npcv2.VideoWriter&#xff08;&#xff09;参数 cv2.VideoWriter() 是 OpenCV 中用于创建视频文件的类。它的参数如下&#xff1a; filename&#xff1a;保存视频的文件名。 fourcc&#xff1a;指定视频编解码器的 FourCC 代码&#xf…

【String str = new String(“hollis“) 创建了几个对象?】

✅典型解析 创建的对象数应该是1个或者2个。 首先要清楚什么是对象? Java是一种面向对象的语言&#xff0c;而Java对象在JVM中的存储也是有一定的结构的&#xff0c;在HotSpot虚机中&#xff0c;存储的形式就是oop-klass model&#xff0c;即ava对象模型。我们在Java代码中&am…

as安装后第一次创建项目,出现gradle下载错误,或无法创建run/debug的启动

大概报错Could not resolve com.android.tools.build:gradle:8.0.1 原因两种第一种就是刚创建好后没有等待他自动下载完成就做了其他操作导致异常&#xff0c;第二组就是瞎几把乱改改错了 我就属于第二种 修改回来的方式&#xff1a; 就这个地方我改成了jdk1.8&#xff0c;然…

Docker 编译OpenHarmony 4.0 release

一、背景介绍 1.1、环境配置 编译环境&#xff1a;Ubuntu 20.04OpenHarmony版本&#xff1a;4.0 release平台设备&#xff1a;RK3568 OpenHarmony 3.2更新至OpenHarmony 4.0后&#xff0c;公司服务器无法编译通过&#xff0c;总是在最后几十个文件时报错,错误码4000&#xf…

Qt制作定时关机小程序

文章目录 完成效果图ui界面ui样图 main函数窗口文件头文件cpp文件 引言 一般定时关机采用命令行模式&#xff0c;还需要我们计算在多久后关机&#xff0c;我们可以做一个小程序来定时关机 完成效果图 ui界面 <?xml version"1.0" encoding"UTF-8"?>…