Redis笔记

特征

键值型,value支持多种不同的数据结构,功能丰富

单线程,每个命令具备原子性

低延迟,速度快(基于内存、IO多路复用、良好的编码)

支持数据持久化

支持主从集群,分片集群

支持多语言客户端

window安装redis

windows下redis安装

linux安装Redis

1.安装依赖

yum install -y gcc tcl

2.上传redis到任意文件夹

3.解压redis压缩包

4.进入redis文件夹

5.运行编译命令

make && make install

6.运行redis

redis-server

7.如果要redis后台启动就需要修改redis的配置文件,在解压缩包下的redis.conf:

先复制一份配置文件防止修改错误

cp redis.conf redis.conf.bck

修改一些配置

#监听的地址,默认是127.0.0.l,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
#守护进程,修改为yes后即可后台运行
daemonize yes
#密码,设置后访问Redis必须输入密码
requirepass 123456

#redis其他常见设置
#监听的端口
port 6379
#工作目录,默认是当前目录,也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录
dir .
#数据库数量,设置为l,代表只使用1个库,默认有16个库,编号0~15
databases 1
#设置redis能够使用的最大内存
maxmemory 512mb
#日志文件,默认为空,不记录日志,可以指定日志文件名
logfile "redis.log"

8.查看是否运行

修改配置文件后运行

redis-server redis.conf

查看redis是否运行

ps -ef | grep redis

结束redis

kill -9 进程号

redis开机自启

1.新建系统服务文件

vi /etc/systemd/system/redis.service

2.内容

[unit]
Description=redis-serverAfter=network.target
[Service]
Type=forking
#注意配置文件路径,版本可能不统一
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.7/redis.conf
PrivateTmp=true
[Install]
wantedBy=multi-user.target

3.重载系统服务

systemctl daemon-reload

4.通过系统来启动redis

#启动redis
systemctl start redis
#查看系统状态
systemctl status redis
#停止redis
systemctl stop redis
#重启redis
systemctl restart redis
#开机自启
systemctl enable redis

redis客户端

在redis安装完成后自带客户端redis-cli

redis-cli [options] [commonds]

其中常见的options有:

​ -h 127.0.0.1):∶指定要连接的redis节点的IP地址,默认是127.0.0.1.

​ -p 6379:指定要连接的redis节点的端口,默认是6379

​ -a 123321∶指定redis的访问密码

其中的commonds就是Redis的操作命令,例如:

​ .ping : 与redis服务端做心跳测试,服务端正常会返回pong

不指定commond时,会进入redis-cli的交互控制台

指定密码后登录redis

#第一种命令行带密码,redis会提示不安全
redis-cli -h 127.0.0.1 -p 6379 -a 123456
#第二种,不带密码
redis-cli -h 127.0.0.1 -p 6379
auth 123456

redis图形化界面

下载地址:Redis图形化工具

Redis数据结构

Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样:
在这里插入图片描述

Redis常用命令

#查询所有符合的key
KEYS *
#删除指定的key
del
#判断key是否存在
exists
#给key设置一个有效期,到期自动删除
expire
#查看key有效期(查询结果是-2时,可以已经删除)
ttl
#查询对应命令帮助
help [commonds]

String类型

String类型,也就是字符串类型,是Redis中最简单的存储类型。其value是字符串,不过根据字符串的格式不同,又可以分为3类:

  1. string:普通字符串
  2. int:整数类型,可以做自增、自减操作
  3. float:浮点类型,可以做自增、自减操作

不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m.

String类型的常见命令string的常见命令有:

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

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

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

MGET:根据多个key获取多个string类型的value

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

INCRBY:让一个整型的key自增并指定步长,例如: incrby num 2让num值自增2
 
INCRBYFLOAT:让一个浮点类型的数字自增并指定步长

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

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

key的结构

Redis的key允许有多个单词形成层级结构,多个单词之间用’∵’隔开,格式如下:

项目名:业务名:类型:id

这个格式并非固定,也可以根据自己的需求来删除或添加词条。

例如我们的项目名称叫heima,有user和product两种不同类型的数据,我们可以这样定义key:

user相关的key: heima:user:i

product相关的key: heima:product:1

如果Value是一个Java对象,例如一个User对象,则可以将对象序列化为JSON字符串后存储:、

在这里插入图片描述

Hash类型

Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。

String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:

在这里插入图片描述

Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

在这里插入图片描述

Hash的常见命令有:

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

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

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

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

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

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

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

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

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

List类型

Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。

特征也与LinkedList类似:

  1. 有序
  2. 元素可以重复
  3. 插入和删除快
  4. 查询速度一般

List类型的常见命令List的常见命令有:

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

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

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

RPOP key:移除并返回列表右侧的第一个元素

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

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

Set类型

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

  1. 无序
  2. 元素不可重复
  3. 查找快
  4. 支持交集、并集、差集等功能

Set类型的常见命令string的常见命令有:

SADD key member ...:向set中添加一个或多个元素

SREM key member ...:移除set中的指定元素

SCARD key:返回set中元素的个数

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

SMEMBERS:获取set中的所有元素

SINTER key1 key2 ...:求key1与key2的交集

SDIFF key1 key2 ...︰求key1与key2的差集

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

SortedSet类型

Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。SortedSet具备下列特性:

1.可排序
2.元素不重复
3.查询速度快
4.因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。

SortedSet类型的常见命令sortedSet的常见命令有:

ZADD key score member:添加一个或多个元素到sorted set,如果已经存在则更新其score值

ZREM key member:删除sorted set中的一个指定元素

ZSCORE key member:获取sorted set中的指定元素的score值

ZRANK key member:获取sorted set中的指定元素的排名

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

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

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

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

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

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

Redis的java客户端

SpringDataRedis

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

在这里插入图片描述

导入依赖

<!--        redis依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--        redis连接池-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

修改配置文件

spring:
  redis:
  	#redis地址
    host: 192.168.1.1
    #redis端口
    port: 6379
    #redis密码
    password: 123456
    lettuce:
      #连接池配置
      pool:
      	#最大连接数
        max-active: 8
        #最大空闲连接
        max-idle: 8
        #最小空闲连接
        min-idle: 0
        #等待时间
        max-wait: 1000ms
    #默认数据库
    database: 0

创建测试类

package com.zdhf;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

@SpringBootTest
class RedisDemoApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void contextLoads() {
        redisTemplate.opsForValue().set("name","zs");
        System.out.println(redisTemplate.opsForValue().get("name"));
    }

}

SpringDataRedis的序列化方式

RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的:

在这里插入图片描述

缺点:
1.可读性差
2.内存占用较大

修改为对应数据的序列化,创建redis配置类

package com.zdhf.Config;

import org.springframework.context.annotation.Bean;
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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        //创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(redisConnectionFactory);
        // 创建json序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 设置key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        // 返回
        return template;
    }
}

SpringBoot在使用GenericJackson2JsonRedisSerializer类时需要导入jackson依赖

<!-- jackson依赖-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

效果:

在这里插入图片描述

尽管JSON的序列化方式可以满足我们的需求,但依然存在一些问题,如图:

在这里插入图片描述

为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。

为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。

手动序列化

package com.zdhf;

import com.alibaba.fastjson.JSON;
import com.zdhf.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.json.JsonbTester;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

@SpringBootTest
class RedisDemoApplicationTests {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void contextLoads() {
        //创建对象
        User user = new User("虎哥", 1);
        //手动序列化并写入redis
        stringRedisTemplate.opsForValue().set("user:200",JSON.toJSONString(user));
        //手动反序列化并读取数据
        System.out.println(JSON.parseObject(stringRedisTemplate.opsForValue().get("user:200")));
    }

}

这里使用了jsonfast工具

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.51</version>
</dependency>

效果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值