Redis = re mote、di ctionary、server(远程字典服务器)
一、docker运行Redis
$ docker run -d -p 6379:6874 --name my_redis redis:lastest
压力测试小工具:redis-benchmark
常用命令:
set、get
dbsize、keys *
select 1、exists [k1]
ping
move [key] [db]
ttl [key]
( time to leave: -1不过期-2已过期)expire [key] [几秒]
type [key]
Redis常见五大数据类型
- String(字符串)k-v;二进制安全;(可以包含任何数据,e.g. jpg图片或者序列化的对象)最多存放512M的Value;
- Hash(哈希,类似Map<String, Object>)k-v(v是一个键值对);string类型的field和value的映射表,特别适合存储对象;
- List(列表,类似LinkedList)字符串列表;按插入顺序排序(有序有重复);添加到元素头部或者尾部(双向链表);键存在值新增;值全移除键就消失;头尾效率高,中间惨淡;
- Set(集合)String类型的无序集合(无序无重复);通过HashTable实现的;
- ZSet(有序集合 sorted set)在Set的基础上,每个元素都会关联一个double类型的分数;通过分数来为集合中的成员进行从小到大排序。(成员不能重复,分数(score)却可以重复)
五大数据类型的操作
- String(单值单value):set/get/del/append/strlen、incr/decr/incrby/decrby(must be number)、getrange/setrange(获取/设置指定下标范围的字符)、setex(set with expire赋值并给过期时间)/setnx(set if not exist)、mset/mget/msetnx(批量操作)、getset(先get再set)
- Hash(value是多个键值对):hset/hget/hmset/hmget(批量)/hgetall(所有键值对全部输出)/hdel(删除某个键值对)、hlen、hexists [key] [key里面某个键值对的键]、hkeys/hvals(所有key/所有value)、hincrby [key] [map的键] N (数字加N)/hincrbyfloat、hsetnx(hset if not exist)
- List(单值多value):lpush/rpush(存放)/lrange [key] 0 -1(输出)、lpop/rpop(出栈)、lindex [key] 0 -1(按照下标获取元素)、llen(length)、lrem [key] N [value] (删N个value)、ltrim [key] [index] [index] (截取指定下标范围的值再赋给key)、rpoplpush [key] [key] (前一个的右给后一个的左)、lset [key] [index] [value] (覆盖下标对应的值)、linsert [key] before/after [value1] [value2] (在value1前/后插入value2)
- Set(单值多value):sadd/smembers/sismember(添加/查看所有/存在)、scard(查询个数)、srem [key] [value] (删除里面的元素)、srandmember [key] N(随机选出N个元素)、spop [key] (随机出栈)、smove [key1] [key2]、数学集合类:sdiff [key] [key] (差集不在第2个里面的第一个key的元素集合)/sinter(交集,找重)/sunion(并集,去重)
- ZSet:
二、springboot 配置 Redis
- 引入 dependency 版本由项目决定 或 手动添加最新版
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置 YAML 文件
spring:
redis:
host: 192.168.59.130
# ⬇️ 扩展配置
database: 3
port: 6379
password:
timeout: 5000 #连接超时时间
jedis:
pool:
max-active: 8 #最大连接数。 使用负值表示无限制
max-wait: -1 #当池耗尽时,在抛出异常之前,连接阻塞的最大时间。 使用负值无限阻塞
max-idle: 8 #最大空闲连接数
min-idle: 0 #最小空闲连接数
time-between-eviction-runs: 60000 #每ms运行一次空闲连接回收器
引入 dependency 之后, 可查看类:
RedisAutoConfiguration
(自动配置类)
查看该类的两个 @Bean:StringRedisTemplate
( k - v 都是 String )、RedisTemplate
( 默认 k - v 都是Object)
- 在
@Autowired
自动装配后, 即可使用其中的方法
@Autowired
private RedisTemplate redisTemplate;
...{
stringRedisTemplate.opsForValue(); //字符串
stringRedisTemplate.opsForList(); //列表
}
- 或者使用更方便的 Operations 系列
@RestController
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
public class RedisController {
// 以下来自官网: https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:template
@Autowired RedisTemplate redisTemplate;
@Autowired StringRedisTemplate stringRedisTemplate;
@Resource(name = "redisTemplate")
ValueOperations<String, String> valueOps;
@Resource(name = "redisTemplate")
ValueOperations<String, Company> AOps;
@GetMapping("/redis/{key}/{value}")
public String redis(@PathVariable("key") String key, @PathVariable("value") String value) {
// valueOps.set(key, value);
valueOps.set(key, value, 5, TimeUnit.MINUTES);
log.info("set " + key + " 成功");
String result = valueOps.get(key);
log.info("value = " + result);
return result;
}
}
三、Redis 有哪些小作用
- 缓存
- 基于 List / ZSet 的排行榜
- 计数器 / 限制器 ( 播放量 / 浏览量 / 在线人数 )
- 社交系列 ( 点赞 / 有多少共同好友 )
- 简易的消息队列
- 分布式 Session 共享
List数据类型
当做队列使用,一个客户端使用rpush生产数据到Redis中,另一个客户端使用lpop取出数据进行消费,非常方便。但要注意的是,使用List当做队列,缺点是没有ack机制和不支持多个消费者。没有ack机制会导致从Redis中取出的数据后,如果客户端处理失败了,取出的这个数据相当于丢失了,无法重新消费。所以使用List用作队列适合于对于丢失数据不敏感的业务场景,但它的优点是,因为都是内存操作,所以非常快和轻量。
PubSub
可以支持多个消费者进行消费,生产者发布一条消息,多个消费者同时订阅消费。但是它的缺点是,如果任意一个消费者挂了,等恢复过来后,在这期间的生产者的数据就丢失了。PubSub只把数据发给在线的消费者,消费者一旦下线,就会丢弃数据。另一个缺点是,PubSub中的数据不支持数据持久化,当Redis宕机恢复后,其他类型的数据都可以从RDB和AOF中恢复回来,但PubSub不行,它就是简单的基于内存的多播机制。之后Redis 5.0推出了Stream数据结构,它借鉴了Kafka的设计思想,弥补了List和PubSub的不足。Stream类型数据可以持久化、支持ack机制、支持多个消费者、支持回溯消费,基本上实现了队列中间件大部分功能,比List和PubSub更可靠。
布隆过滤器
其底层实现利用的是 String 数据结构和位运算,可以解决业务层缓存穿透的问题,而且内存占用非常小,操作非常高效
签到的场景
使用了BitMap结构
排行榜场景
使用了SortSet结构
购物车场景
使用了HashSet结构
四、Redis CentOS 安装
EPEL is known as “Extra Packages for Enterprise Linux” repository having lots of extra packages which is not added in official repositories.
REMI is a third party repository provides latest version of packages which is already included in official repositories of CentOS and Red Hat.
- Install EPEL Repository
EPEL release package is available under default CentOS repositories. So use the following command to install EPEL yum repository on your CentOS/RHEL 7/6/5 systems.
yum install epel-release
In the case of command doesn’t work for you, use one of below commands.
### For CentOS/RHEL 7 ###
rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
### For CentOS/RHEL 6 ###
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
- Install REMI Repository
Use following commands to install REMI yum repository on your CentOS/RHEL 7/6/5 systems. Make sure you already have installed EPEL repository before installing REMI.
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
or
### For CentOS/RHEL 7 ###
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
### For CentOS/RHEL 6 ###
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
- List all Installed Repository
Use following command to list all installed yum repositories in your system.
yum repolist
安装 Redis
# 安装 Redis
yum install redis
# 启动
sudo systemctl start redis
sudo systemctl enable redis
sudo systemctl status redis
# 配置
vim /etc/redis.conf
# bind 127.0.0.1 192.168.121.233
systemctl restart redis
# 验证
# Use the following ss command to verify that the Redis server is listening on your private interface on port 6379:
ss -an | grep 6379
# 防火墙
sudo firewall-cmd --new-zone=redis --permanent
sudo firewall-cmd --zone=redis --add-port=6379/tcp --permanent
sudo firewall-cmd --zone=redis --add-source=192.168.121.0/24 --permanent
sudo firewall-cmd --reload
# Test
redis-cli -h <REDIS_IP_ADDRESS> ping
# Output: PONG