redis 的相关知识点

启动

  1. 启动代码

     redis-cli -a 密码

通用命令

expire: 设置有效期

expire name 10

key

key *

相关数据类型

String

set:添加或者修改已经存在的一个String类型的键值对

set age 19

get:根据key获取String类型的value

get age

mset:批量添加多个String类型的键值对

mset k1 v1 k2 v2

mget:根据多个key获取多个String类型的value

mget k1 k2

incr:让一个整型的key自增1

 incr age
19--->20

incrby:让一个整型的key自增并指定步长

incrby age 2
incrby age -1

incrbyfloat:让一个浮点类型的数字自增并指定步长

incrbyfloat score 0.5

setnx:添加一个String类型的键值对,前提是这个key不存在,否则不执行

setnx name leixin

setex:添加一个String类型的键值对,并且指定有效期

 setex names 10 "leixin"

Hash类型

HSET key field value:添加或者修改hash类型key的field的值

 hset leixin:name name "leixin"
hset leixin:name name2 "leixin"

HGET key field:获取一个hash类型key的field的值

hget leixin:name name2

HMSET:批量添加多个hash类型key的field的值

HMGET:批量获取多个hash类型key的field的值

HGETALL:获取一个hash类型的key中的所有的field和value

hgetall leixin:name

HKEYS:获取一个hash类型的key中的所有的field

hkeys leixin:name

HVALS:获取一个hash类型的key中的所有的value

hvals leixin:name

HINCRBY:让一个hash类型key的字段值自增并指定步长

hincrby leixin:name age 2

HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

List

特征与LinkedList类似:

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般
  • 常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。

如何利用List结构模拟一个栈?

入口和出口在同一边

如何利用List结构模拟一个队列?

入口和出口在不同边

如何利用List结构模拟一个阻塞队列?

入口和出口在不同边出队时采用BLPOP或BRPOP


  1. LPUSH key element ... :向列表左侧插入一个或多个元素

    lpush users 1 2 3 4 5

    此时实际为 5 4 3 2 1

  2. RPUSH key element ... :向列表右侧插入一个或多个元素

     rpush users 6 7

    此时实际为 5 4 3 2 1 6 7

  3. LPOP key count:移除并返回列表左侧的count个元素,没有则返回nil

     lpop users 3

    此时移除并返回 5 4 3

  4. RPOP key count:移除并返回列表右侧的count元素

     rpop users 3

    此时移除并返回的是 7 6 1

  5. LRANGE key star end:返回一段角标范围内的所有元素

     lrange users 0 0

    此时返回的是 2

  6. BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil

     blpop users2 100

    此时等待中

    这个时候新开一个控制台

    lpush users2 1

    此时不超过100s的话就会出来结果

    1) "users2"
    2) "1"
    (34.91s)

Set

Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集、并集、差集等功能
  1. SADD key member ... :向set中添加一个或多个元素

    sadd s1 a b c
  2. SREM key member ... : 移除set中的指定元素

    srem s1 a
  3. SCARD key: 返回set中元素的个数

    scard s1
  4. SISMEMBER key member:判断一个元素是否存在于set中

    sismember s1 b
  5. SMEMBERS:获取set中的所有元素

    smembers s1
  6. SINTER key1 key2 ... :求key1与key2的交集

  7. SDIFF key1 key2 ... :求key1与key2的差集

  8. SUNION key1 key2 ..:求key1和key2的并集

SortedSet

  • 可排序
  • 元素不重复
  • 查询速度快
  1. ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值

    zadd students 87 jack 88 jerry
  2. ZREM key member:删除sorted set中的一个指定元素

    zrem students jack
  3. ZSCORE key member : 获取sorted set中的指定元素的score值

    zscore students jerry
  4. ZRANK key member:获取sorted set 中的指定元素的排名

     zrank students jerry

    排名是从0开始的

  5. ZCARD key:获取sorted set中的元素个数

     zcard students
  6. ZCOUNT key min max:统计score值在给定范围内的所有元素的个数

  7. ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值

  8. ZRANGE key min max:按照score排序后,获取指定排名范围内的元素

  9. ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素

  10. ZDIFF、ZINTER、ZUNION:求差集、交集、并集

  11. 注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可

SpringDataRedis

API 返回值类型 说明
redisTemplate.opsForValue() ValueOperations 操作String类型数据
redisTemplate.opsForHash() HashOperations 操作Hash类型数据
redisTemplate.opsForList() ListOperations 操作List类型数据
redisTemplate.opsForSet() SetOperations 操作Set类型数据
redisTemplate.opsForZSet() ZSetOperations 操作SortedSet类型数据
redisTemplate 通用的命令

快速入门

  1. 导入依赖

    <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    </dependency>
    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    </dependency>
  2. 配置文件

    spring:
    redis:
    host: 192.168.122.120
    port: 6379
    password: 73883672
    jedis:
    pool:
    max-active: 8
    max-idle: 0
    max-wait: 100ms
  3. 进行测试

    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    void testString() {
    //写入一条String数据
    redisTemplate.opsForValue().set("name","google");
    //获取String数据
    Object name = redisTemplate.opsForValue().get("name");
    System.out.println(name);
    }
  4. 此时会发现redis数据库只有一些转码了的序列,此时我们需要进行手动序列化

    @Configuration
    public class RedisConfig { @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
    // 创建RedisTemplate对象
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    // 设置连接工厂
    template.setConnectionFactory(connectionFactory);
    // 创建JSON序列化工具
    GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
    // 设置Key的序列化
    template.setKeySerializer(RedisSerializer.string());
    template.setHashKeySerializer(RedisSerializer.string());
    // 设置Value的序列化
    template.setValueSerializer(jsonRedisSerializer);
    template.setHashValueSerializer(jsonRedisSerializer);
    // 返回
    return template;
    }
    }
  5. 此时测试注入对象

     @Test
    void testSaveUser(){
    //User有两个参数,一个是name,一个是age
    redisTemplate.opsForValue().set("user:100",new User("leixin",20));
    User o =(User) redisTemplate.opsForValue().get("user:100");
    System.out.println("o = "+o);
    }
  6. 此时发现多了一个class参数,数据量一大,这是非常浪费空间的。

    {
    "@class": "com.leixin.pojo.User",
    "name": "leixin",
    "age": 20
    }

简单优化

  1. 使用StringRedisTemplate
  2. 写入Redis时,手动把对象序列化为JSON
  3. 读取Redis时,手动把读取到的JSON反序列化为对象
 @Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void testString(){
stringRedisTemplate.opsForValue().set("name","leixin");
String name = stringRedisTemplate.opsForValue().get("name");
System.out.println(name); } private static final ObjectMapper mapper = new ObjectMapper(); @Test
void testSaveUser() throws JsonProcessingException {
// 创建对象
User user = new User("虎哥", 21);
// 手动序列化
String json = mapper.writeValueAsString(user);
// 写入数据
stringRedisTemplate.opsForValue().set("user:200", json); // 获取数据
String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
// 手动反序列化
User user1 = mapper.readValue(jsonUser, User.class);
System.out.println("user1 = " + user1);
}
@Test
void testHash() {
stringRedisTemplate.opsForHash().put("user:400", "name", "虎哥");
stringRedisTemplate.opsForHash().put("user:400", "age", "21"); Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:400");
System.out.println("entries = " + entries);
}

redis相关知识点的更多相关文章

  1. redis 相关知识点

    (1)什么是redis? Redis 是一个基于内存的高性能key-value数据库. (有空再补充,有理解错误或不足欢迎指正) (2)Reids的特点 Redis本质上是一个Key-Value类型的 ...

  2. Redis基础知识点面试手册

    Redis基础知识点面试手册 基础 概述 数据类型 STRING LIST SET HASH ZSET(SORTEDSET) 数据结构 字典 跳跃表 使用场景 会话缓存 缓存 计数器 查找表 消息队列 ...

  3. UITableView相关知识点

    //*****UITableView相关知识点*****// 1 #import "ViewController.h" // step1 要实现UITableViewDataSou ...

  4. Android开发涉及有点概念&相关知识点(待写)

    前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...

  5. IOS开发涉及有点概念&相关知识点

    前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...

  6. IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结

    添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...

  7. 学习记录013-NFS相关知识点

    一.NFS相关知识点 1.NFS常用的路径/etc/exports NFS服务主配置文件,配置NFS具体共享服务的地点/usr/sbin/exportfs NFS服务的管理命令,exportfs -a ...

  8. TCP/IP 相关知识点与面试题集

    第一部分:TCP/IP相关知识点 对TCP/IP的整体认 链路层知识点 IP层知识点 运输层知识点 应用层知识点 (这些知识点都可以参考:http://www.cnblogs.com/newwy/p/ ...

  9. Python开发一个csv比较功能相关知识点汇总及demo

    Python 2.7 csv.reader(csvfile, dialect='excel', **fmtparams)的一个坑:csvfile被csv.reader生成的iterator,在遍历每二 ...

随机推荐

  1. 探索Django验证码功能的实现 - DjangoStarter项目模板里的封装

    前言 依然是最近在做的这个项目,用Django做后端,App上提交信息的时候需要一个验证码来防止用户乱提交,正好我的「DjangoStarter」项目脚手架也有封装了验证码功能,不过我发现好像里面只是 ...

  2. zabbix proxy cannot perform check now for itemid [xxxxx]: item is not in cache

    情况 接上次做完容器部署proxy后,为其添加host进行添加任务. 发现一直没有数据,就到item里面执行 execute now. 然后过了几分钟回来一看,还是没有. Emmm,看下log吧. S ...

  3. 如何为我的VUE项目编写高效的单元测试--Jest

    Unit Testing(单元测试)--Jest 一个完整的测试程序通常由几种不同的测试组合而成,比如end to end(E2E)测试,有时还包括整体测试.简要测试和单元测试.这里要介绍的是Vue中 ...

  4. 【直播回顾】OpenHarmony知识赋能第四期第二课——GPIO驱动开发

    3月17日晚上19点,​知识赋能第四期直播的第二节课<OpenHarmony标准系统HDF框架之GPIO驱动开发>​,在OpenHarmony开发者成长计划社群内成功举办. 本期课程,由​ ...

  5. 踩了个DNS解析的坑,但我还是没想通

    hello大家好,我是小楼. 最近踩了个DNS解析的小坑,虽然问题解决了,但排查过程比较曲折,最后还是有一点没有想通,整个过程分享给大家. 背景 最近负责的服务要置换机器.置换机器可能很多小伙伴不知道 ...

  6. 字符串/16进制/ASCII码的转换

    1 /// <字符串转16进制格式,不够自动前面补零> 2 /// 假设文本框里面填写的是:01 02 03 04 05 06 3 /// Str获取的是01 02 03 04 05 06 ...

  7. SerialPort-4.0.+ 使用说明(Java版本)

    SerialPort-4.0.+ 项目官网 Kotlin版本使用说明 介绍 SerialPort 是一个开源的对 Android 蓝牙串口通信的轻量封装库,轻松解决了构建自己的串口调试APP的复杂程度 ...

  8. Jquery_效果-隐藏显示、淡入淡出、滑动面板、简单的动画队列

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  9. YARN线上动态资源调优

    背景 线上Hadoop集群资源严重不足,可能存在添加磁盘,添加CPU,添加节点的操作,那么在添加这些硬件资源之后,我们的集群是不能立马就利用上这些资源的,需要修改集群Yarn资源配置,然后使其生效. ...

  10. Redis为什么变慢了?透彻解读如何排查Redis性能问题

    Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右.但也正因此如此,当我们在使用 Redis 时,如果发现操作延迟变大的情况,就会与我们的预期不符. 你也 ...