Redis学习笔记
— NoSql数据库,基于Key-Value键值对存储。
Redis 优势
1.性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
2.丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
3.原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
4.丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
5.Redis运行在内存中但是可以持久化到磁盘.提供两种不同持久化方法将数据存储到硬盘。一种rdb形式(全量数据备份,备份的是数据),一种aof形式(增量持久化备份,备份的是指令)。
常用redis基础数据类型和命令
String
1、set/get - 设置和获取key对应的值
eg:
set age 18
get age
2、mget - 批量获取多个key值,不存在则返回nil
eg:
mget age name
3、incr && incrby - incr对key对应的值进行++操作,并返回新值;incrby加指定值。
eg:
incr age
incrby age 10
4、decr && decrby - decr对key对应的值进行–操作,并返回新值;incrby减指定值。
eg:
decr age
decr age 10
5、setnx(set if not exist)- 设置key对应的值为String类型value,如果key已存在则返回0(代表失败),1代表成功。
eg:
setnx age 22
6、setex(set expire)- 设置key对应的值为String类型value,并设定有效期。
eg:
setex name3 10 xxxx //(10s过期)
7、其他命令
getrange 获取key对应value子字符串
eg:
getrange name 0 3
mset 批量设置多个key的值,如果成功表示所有值都被设置,否则返回0表示没有任何值被设置
eg:
mset name1 xxx name2 yyy
msetnx,同mset,不存在就设置,不会覆盖已有的key
eg:
msetnx name xxx name3 zzz
getset 设置key的值,并返回key旧的值
eg:
getset name4 xxxyyy
append 给指定key的value追加字符串,并返回新字符串长度
eg:
append name qqq
Hash
hset-设置key对应的HashMap中的field的value
hget-获取key对应的HashMap中的filed的value
hgetall-获取key对应的HashMap中所有field的value
hlen-返回key对应的HashMap中的field的数量
eg:
hset myhashmap keyxxx valueyyy
hget myhashmap keyxxx
hgetall myhashmap
hlen myhashmap
hmset-批量设置和获取
eg:
hmset myhashmap name1 xxx name2 yyy name3 zzz
hdel-删除某个key
eg:
hdel myhashmap name1
List
–使用场景:消息队列,好友列表等
lpush——在key对应的list的头部添加一个元素
eg:
lpush mylist value1 value2 value3
lrange——获取key对应的list的指定下标范围的元素,-1表示获取所有元素
eg:
lrange mylist 0 -1
lrange mylist 0 3
rpush——在key对应的list的尾部添加一个元素
eg:
rpush mylist value4
llen——列表长度
lindex——获取具体值
lpop——从key对应的list的头部删除一个元素,并返回该元素
rpop——从key对应的list的尾部删除一个元素,并返回该元素
eg:
llen mylist
lindex mylist 3
lpop mylist
rpop mylist
Set
sadd——在key对应的set中添加一个元素
smembers——在获取key对应的set所有元素
spop——随机返回并删除set中一个元素
sdiff——求两个集合差集
sunion——求key对应的set并集
sinter——求key对应的set交集
eg:
sadd myset value1 value2 value3 value4
smembers myset
spop myset
sdiff myset1 myset2
sunion myset1 myset2
sinter myset1 myset2
SortSet
– Set的基础上增加顺序score,再根据score进行排序。比如用SortSet实现排行榜
zadd——在key对应的zset中添加一个元素
zrange——获取key对应的zset中指定范围元素,-1表示获取所有元素
zrem——删除key对应的zset中一个元素
zrangebyscore——返回有序集key中,指定分数范围的元素列表,排行榜中运用
zrank——返回key对应的zset中指定member排名。其中member按score值递增(从小到大);排名以0为底,也就是说,score值最小的成员排名为0,排行榜中运用
eg:
zadd myset 1 setvalue1 2 setvalue2 3 setvalue3
zrange myset 0 -1
zrange myset 0 -1 withscores
zrem myset setvalue2
zrangebyscore myset 1 3
zrank myset setvalue3
Redis消息订阅与发布
– 类似于信息管道,用来进行系统间消息解耦,类似于mq。主要有消息发布者和订阅者。比如运用于:订单支付成功,会员支付成功,会员系统加积分,钱包扣钱,发货系统等。
1、PUBLISH
–将信息message发送到指定频道Channel。返回收到的客户端数量。
2、SUBSCRIBE
–订阅给指定频道信息。
3、UNSUBSCRIBE
–取消订阅指定频道,如不指定,则取消订阅所有频道。
Redis事务
1、MULTI 与 EXEC命令
–以 MULTI 开始一个事务,然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令。
2、DISCARD命令
–订用于取消一个事务, 它清空客户端的整个事务队列, 然后将客户端从事务状态调整回非事务状态, 最后返回字符串 OK 给客户端, 说明事务已被取消。
3、WATCH命令
–用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败。
redis作业场景
1.利用Redis的发布和订阅功能,实现消息的存储推送
2.Redis实现分布式session共享
3.利用Redis的zset score的有序性,实现数据的排序
java springboot配置redis
1 gradle依赖包:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-data-redis-reactive'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-web-services'
implementation 'org.springframework.boot:spring-boot-starter-websocket'
implementation group: 'redis.clients', name: 'jedis', version: '3.3.0'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
runtime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testImplementation 'io.projectreactor:reactor-test'
compile group: 'org.webjars', name: 'jquery', version: '3.5.1'
}
2 RedisConfig配置:
package com.learn.redis_demo.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
@Configuration
public class RedisConfig {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer() {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(redisConnectionFactory);
return container;
}
}
3 通过java操作redis
package com.learn.redis_demo.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;
import java.util.Set;
@Component
public class RedisService {
@Autowired
StringRedisTemplate redisTemplate;
public void add(String key, String value, double score) {
redisTemplate.opsForZSet().add(key, value, score);
}
public Set<String> range(String key, int start, int end) {
return redisTemplate.opsForZSet().range(key, start, end);
}
public Set<ZSetOperations.TypedTuple<String>> rangeWithScore(String key, int start, int end) {
return redisTemplate.opsForZSet().rangeWithScores(key, start, end);
}
}