Redis

Nosql概述
为什么要使用?
信息爆炸增长,需要使用Nosql

Not Only SQL
泛指非关系型数据库
关系型数据库:表格,行,列
缓存:减轻数据库压力,保证效率

很多数据类型不需要一个固定的格式,不需要多余的操作进行横向扩展。
Map<String,Object>使用键值对来使用控制

nosql特点
1.方便拓展(数据之间没有关系)
2.大数据量高性能(Redis 1秒写8万,读11万)
3.数据类型是多样型(不需要事先设计数据库,随去随用)
4.传统RDBMS和NoSQL

传统的RDBMS
-结构化组织
-SQL
-数据和关系都存在单独的表中
-严格的一致性
-基础的事务

NoSQL
-不仅仅是数据
-没有固定的查询语言
-键值对存储,列存储,文档存储,图像数据库(社交关系)
-最终一致性
-CAP定理BASE
-高性能,高可用,高可扩展

Redis
Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现主从同步。

能干嘛?
1.内存存储、持久化,内存中是断电即失
2.效率高,可以用于高速缓存
3.发布订阅系统
4.地图信息分析
5.计时器、计数器(浏览量)

特性
1.多样的数据类型
2.持久化
3.集群
4.事务

使用redis -cli 进行连接测试

在这里插入图片描述
性能测试分析
在这里插入图片描述
十万个请求用时0.3秒
50个并发
每次只写入3个字符串
只有1台服务器连接
在这里插入图片描述
处理进度

redis基础知识
有16个数据库,默认使用第0个

./redis-cli -h 127.0.0.1 -p 6379 -a “密码” 连接redis,bin下面
keys * 查看数据库所有的key
flushdb 清除当前数据库
flushall 清除全部的数据库
exists 判断当前key是否存在

在这里插入图片描述

五大数据类型
expire name 10 ----name值10秒后过期
ttl name -----查看当前key的剩余时间
del name 1 -----移除当前的key
append key1 “hello” ------在key1后面追加hello(如果当前key不存在就相当于set一个)

strlen key1 -----获取字符串长度
incr views -------浏览量加一 自增1
decr views -------浏览量减一 自减1
incrby views 5 ----------加4 可以设置步长,指定增量
decrby views 2 ---------减2
getrange key start end ------获取其中的字符串
getrange key 0 -1 ------获取全部的字符串
setrange key offset value ----修改从第offset位开始,修改后长度不变
setex(set with expire) -----设置过期时间
setnx(set ifnot exist) -----不存在则设置
mset key value -----批量设置
mget key ------批量获取
mset user:1:name zs user:1:age 22 -----user:{id}:{filed}
getset -----先get然后再set 不存在值,则返回nil;存在值,则获取原来的值,并设置新的值
String:value除了是字符串还可以是数字

list ----实际上是一个链表
所有的list都用l开头
lpush key element ----将值放入列表的头部
rpush key element ----将值放入列表的尾部
lrange key start stop ----查询所有
lpop key -----移除头部的第一个值
rpop key -----移除尾部的第一个值
lindex key index ------获取头部中的某个值(从0开始计数)
len list -----查看长度
lrem key cout value -----移除指定的值
ltrim key start stop -----截取值中的一部分
rpoplpush ------移除列表中的最后一个元素,并将他移动到新的列表中
lset key index element -----将列表中指定下标的值替换成另一个值(首先列表要存在)
linsert key before|after pivot element -----将一个值插入列表中的前面或者后面

set中的值是不能重复的
sadd key member -----添加一个值
srem key member -----移除一个值
smembers key ------查看指定set的所有值
sismember key value ----判断值是不是在某个set集合中
scard key ----获取set中值的个数
srandmember key count-----随机获取集合中的count个元素
spop key -----随机删除一些set集合中的元素
smove source destination member -----移动指定元素去另一个集合中
sdiff key key -----以前一个为主要,列出差集
sinter key key ----以前者为主要,列出两者交集
sunion key key -----以前者为主要,列出两者并集

hash—map集合—本质和string没有太大的区别
hset key field value -----存值
hmset key field value -----同时存多个值
hget key field ----取值
hmget key field ----同时获取多个值
hgetall key ------获取所有值
hdel key field ----删除指定的key,value也会被删除
hlen key ----获取hash字段的数量
hexists key field ----判断某一个value是否存在
hkeys key -----只获得当前所有的key
hvals key -----只获得当前所有的value
hincrby key field increment ------使一个value值加1
hsetnx key field value -----不存在创建,存在不能创建

Zset(有序集合)
zadd myset 1 one ------添加一个值
zrange myset 0 -1 -------查找全部
zrangescore v2 -inf +inf withscores -----排序并显示值(从小到大1排序)
zrevrange v2 0 -1 --------排序(从大到小)
zrem key member ------移除一个元素
zcard key -----统计有序集合中的元素个数
zcount v1 1 3 ------获取指定区间的成员数量

三种特殊的数据类型

geoadd 添加地理位置
geopos 获取指定城市的经度纬度
geodist 获取两个城市之间的距离(默认单位为米)
georedis 以此为半径搜索附近的地点
—withdist 显示到中心距离的位置
—withcoord 显示他人的定位信息
georedisbymember 查找位于指定位置周围的元素

底层是zset,可以使用zset相关的命令

Hyperloglog基数统计

Pfadd —添加
pfcount —统计个数
pfmerge ----合并

Bitmaps
在这里插入图片描述

setbit key offset value -----设值
getbit key offset ----获得一个值
bitcount sign ----统计次数

事务
redis单条命令是保证原子性的,但是事务不保证原子性

开启事务(multi-)
命令入队()
执行命令(exec)
放弃事务(discard)

代码异常,所有事务命令都不会被执行。
运行时异常,语法错误,执行命令时其他命令正常执行,错误命令抛出异常。


乐观锁:特定时刻开启
悲观锁:一直开启
watch 开启监视(watch本身就是乐观锁)

Jedis
java连接开发工具。Java操作Redis中间件。

springboot整合redis

package com.example.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.RedisSerializer;

@Configuration
public class RedisConfig {
	@Bean
	public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
		RedisTemplate<String, Object> template = new RedisTemplate<>();
		template.setConnectionFactory(redisConnectionFactory);
		// 配置序列化方式: Key序列化为String,Value序列化为JSON(默认使用Jackson)
		template.setKeySerializer(RedisSerializer.string());
		template.setValueSerializer(RedisSerializer.json());
		template.setHashKeySerializer(RedisSerializer.string());
		template.setHashValueSerializer(RedisSerializer.json());
		return template;
	}
}


实体类需要执行序列化


@Resource
private StringRedisTemplate stringRedisTemplate;

//key
String a = "consumerHonor_" + sid + "_" + hid;
//从redis中获取key,查看是否有值
String re = stringRedisTemplate.opsForValue().get(a);
if (StringUtils.isBlank(re) || "null".equals(re)) {
	//把key和value塞进redis
   stringRedisTemplate.opsForValue().set(a, a);
} else {
    return ResultUtil.error("正在使用!");
}
        
 if (StringUtils.isNotBlank(a)) {
     System.out.println("释放");
     //把redis里面的key删除
     stringRedisTemplate.delete(a);
 }

redis持久化
redis为内存数据库,不保存在磁盘中,断电即失
RDB
恢复rdb文件,只需要重启redis
优点:适合大规模的数据恢复;对数据的完整性要求不高
缺点:需要一定的时间间隔进程操作;fork进程的时候,会占用一定的内存空间
AOF
默认是不开启的,重启即可生效
优点:每次修改都同步,保证完整性;每秒同步一次,可能会丢失一秒数据;从不同步,效率最高
缺点:aof远大rdb,修复速度慢;aof运行效率比rdb慢
在这里插入图片描述

在这里插入图片描述
Redis发布订阅
subscribe 订阅一个频道
publish 发布者发布消息

Redis主从复制
默认情况下,每个redis服务器都是主节点
在这里插入图片描述
info replication 查看当前库的信息
slaveof 配置主机
slaveof no one 使自己成为主机

主机可以写,从机不能写只能读。主机中的所有信息和数据,都会自动被从机保存
测试:主机断开连接,从机依旧连接主机的,但是没有写操作,这个时候,主机如果回来了,从机依旧可以直接获取到主机写的信息
如果是使用命令行来配置的主从,这个时候如果重启了,就会变回主机。只要变为从机,立马就会从主机中获取值
在这里插入图片描述
哨兵模式
sentinel.config
sentinel monitor 被监控的名称 host post 1
优点
1.哨兵集群,基于主从复制模式,所有的主从配置优点,它全有
2.主从可以切换,故障可以转移,系统的可用性就会更好
3.哨兵模式就是主从模式的升级,手动到自动,更加健壮
缺点
1.redis不好在线扩容,集群容量一旦达到上限,在线扩容十分麻烦
2.实现哨兵模式的配置其实很麻烦的,里面有很多选择

redis缓存穿透和雪崩
穿透----查不到
击穿----量太大
缓存雪崩
在这里插入图片描述
在这里插入图片描述

添加链接描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值