当前位置:   article > 正文

Redis基本知识、语法及相关操作_合位图、超小内存唯一值记数

合位图、超小内存唯一值记数

一、Redis初识

1、Redis是什么
—开源
—多种数据结构
—基于键值的存储服务器系统
—高性能、功能丰富
2、Redis的特性
—速度快(10w OPS)
Redis将数据存储在内存当中、C语言写的、单线程模式
—持久化(断电数据不丢失)
Redis所有数据保存在内存中,对数据的更新将异步地保存到磁盘上
—多种数据结构
在这里插入图片描述
BitMaps(位图)、HyperLogLog(超小内存唯一值计数)
GEO(地理信息定位)

—功能丰富
发布订阅、Lua脚本、事务、pipeline
—简单
不依赖外部库、单线程模型
—主从复制
在这里插入图片描述
在这里插入图片描述

—高可用、分布式

2、Redis典型应用场景
—缓存系统
在这里插入图片描述
—计数器
微博的转发数、评论数量
—消息队列系统
在这里插入图片描述
—排行榜

—社交网络

—实时系统

3、Redis安装及启动
在这里插入图片描述
Redis可执行文件说明
—redis-server(Redis服务器)
—redis-cli(Redis命令客户端)
—redis-benchmark(Redis性能测试工具)
—redis-check-aof(AOF文件修复工具)
—redis-check-dump (RDB文件检查工具)
—redis-sentinel (Sentinel服务器(2.8以后))

Redsi的三种启动方式
—最简启动
redis-server (ps -ef | grep redis)、(netstat -antpl | grep redis)、(redis-cli -h ip -p port ping)
—动态参数启动
redis-server --port 6379
—配置文件启动(生产环境选择、单机多实例配置可以用端口区分)
redis-server configPath
4、客户端连接
在这里插入图片描述
Redis客户端返回值
—状态回复
—错误回复
—字符串回复
—多行字符串回复

5、Redis常用配置
l—daemonize (是否是守护进程)
—port(6379) (Redsi对外端口号)
—logfile (Redis系统日志)
—dir (Redis工作目录)

二、Redis API的使用和理解

—通用命令
通用命令
keys * (遍历所有的key、时间复杂度O(n))、dbsize(计算key的总数、时间复杂度O(1))、exists key(检查key是否存在、时间复杂度O(1))、del key(删除指定的key-value、时间复杂度O(1))、expire key seconds(key在seconds秒后过期、时间复杂度O(1))、type key(返回key的类型、时间复杂度O(1))
数据结构和内部编码
在这里插入图片描述
—单线程架构(在一个瞬间只会执行一条命令)
单线程为什么这么快
纯内存、非阻塞IO、避免线程奇幻和竞态消耗
在这里插入图片描述

—字符串类型
(1)字符串键值结构
key value
(2)使用场景
缓存、计数器、分布式锁等等
(3)API
get key 、set key value、del key、incr key(自增1)、decr key(自减1)、setnx key value(不存在才设置)、getset key newvalue(设置一个新的值返回旧值)、append(将value追加到旧的value)、strlen key(返回字符串长度)、incrbyfloat、getrange、setrange
在这里插入图片描述
实战用Mysq和Redis举例
在这里插入图片描述
Java代码实现

public VideoInfo get(Long id){
	String redisKey = redisPrefix + id;
	VideoInfo  vi = redis.get(redisKey);
	if(vi == null){
	vi = mysql.get(i);
	if(vi != null){
	//序列化
	redis.set(redisKey.serialize(vi));
	}
	}
	return vi;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

分布式id生成器
incr id
在这里插入图片描述
总结
在这里插入图片描述

—哈希类型
key field value
field不能相同,value可以相同 (可以理解成Mapmap、Small redis)
在这里插入图片描述
API
hget key field、hset key field value、hdel key field、hgetAll、hexists(判断hash key是否有field)、hlen(获取hash key的field数量)、hmget、hmset、hvals key、hkeys key
实战记录网站每个用户个人主页的访问量
hincrby user:1:info pageview count(保证用户是一个整体
缓存视频的基本信息(Mysql做为数据源)

public VideoInfo get(long id){
	String redisKey = redisPrefix + id;
	Map<String,String> hashMap = redis.hgetAll(redisKey);
	VideoInfo  vi = transferMapToVideo(hashMap);
	if(vi == null){
	  vi = mysql.get(id);
	  if(vi != null){
	  redis.hmset(redisKey,transferVideoMap(vi);
	}
	return vi;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述
哈希总结
在这里插入图片描述

—列表类型
列表结构
在这里插入图片描述
特点:有序、可以重复、左右两边插入弹出
API
rpush key value1…(从列表右边进行插入)、lpush key value1…(从列表左边进行插入)
linser key before|after value newValue(在list指定的值前|后插入value值)、lpop、rpop、lrem key count value(根据count值进行删除 count==0删除所有value相等的项count<0,从右往左删,count>0从左往右删时间复杂度为O(n))、ltrim key start end(按照索引范围修建列表时间复杂度为O(n))、lrange key start end(包含end)O(n))、lindex key index、llen key、lset key index newValue(O(n))、blpop、brpop
实战 你关注的人更新微博,LPUSH

技巧
LPUSH + LPOP = Stack
LPUSH + RPOP = Queue
LPUSH + LTRIM = Capped Collection
LPUSH + BRPOP = Message Queue
—集合类型
集合结构
key values
在这里插入图片描述
特点
无序、无重复、集合间的操作
API
sadd key element(O(1))、srem key elementO(1)、scard(计算集合大小)、sismember、srandmember、smembers、sscan(扫描游标)、spop、zrevrank、zrevrang、zrerangbyscore、zinterstore、
zunionstore

实战-抽奖系统、Like、赞、踩、标签(tag)
集合间的API
sdiff、sinter、sunion
在这里插入图片描述
技巧
SADD = Tagging
SPOP/SRANGMEMBER = Random item
SADD + SINTER = Socail Graph
—有序集合类型
有序集合结构
key score value
在这里插入图片描述
API
zadd key score element(可以是多对)O(logn)、zrem key element(删除)、zscore key element(返回元素分数)、zincrby key increScore element、zcard key(返回元素个数O(1))、zrank、zrang key start end、zrangebyscore、zcount key minScore maxScore、zremrangebyrank key start end
实战-排行榜
总结
在这里插入图片描述

三、Redis客户端及使用

1、Jedis是什么
Jedis类似于一个shell的Java客户端
在这里插入图片描述
使用

Maven依赖

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <type>jar</type>
    <version>3.1.0-m3</version>
    <scope>compile</scope>
</dependency>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Jedis直连接
在这里插入图片描述

//生成一个Jedis对象,这个对象负责和指定Redis节点进行通信
Jedis jedis = new Jedis("127.0.0.1",6379);
//jedis执行set操作
jedis.set("hello","world");
//jedis执行get操作,value="world";
String value = jedis.get("hello");

Jedis(String host,int port,int connectionTimeout,int soTimeout)
host: Redis节点的所在机器的IP
post: Redis节点的端口
connectionTimeout:客户端连接超时
soTimeout:客户端读写超时
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

简单使用

//String
jedis.set("hello","world");
jedis.get("hello");
jedis.incr("counter");

//hash
jedis.hset("myhash","f1","v1");
jedis.hset("myhash","f2","v2");
jedis.hgetAll("myhash");

//list
jedis.rpush("mylist","1");
jedis.rpush("mylist","2");
jedis.rpush("mylist","3");
jedis.rrange("mylist",0,-1);

//set
jedis.sadd("myset","a");
jedis.sadd("myset","b");
jedis.sadd("myset","a");
jedis.smembers("myset"); //输出结果为:a,b

//zset
jedis.zadd("myzset",99,"tom");
jedis.zadd("myzset",96,"poter");
jedis.zadd("myzset",55,"janmes");
jedis.zrangWithScores("myzset",0,-1);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

Jedis连接池使用

在这里插入图片描述
连接池简单使用

//初始化Jedis连接池,通常来讲JedisPool是单例的。
GennericObjectPoolConfig poolConfig = new GennericObjectPoolConfig();
JedisPool jedisPool = new JedisPool(poolConfig,"127.0.0.1",6379);
Jedis jedis = null;
try{
//从连接池获取jedis对象
jedis = jedisPool.getResource();
//执行操作
jedis.set("hello","world");
}catch(Exception e){
e.printStackTrance();
}finally{
if(jedis !=null){
  //如果使用JedisPool,close操作不是关闭连接,代表归还连接池
  jedis.close();
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

Jedis直连和Jedis连接池对比
在这里插入图片描述

四、瑞士军刀Redis

1、慢查询

生命周期
在这里插入图片描述
两个配置 slowlog-max-len
—先进先出队列
—固定长度
—保存在内存内
—慢查询阀值(单位:微妙)
—slowlog-log-slower-than = 0,记录所有命令
—slowlog-log-slower-than < 0,不记录所有命令
配置方法
默认值
慢查询命令

slowlog get [n] :获取慢查询队列
slowlog len:获取慢查询队列长度
slowlog reset:清空慢查询队列
  • 1
  • 2
  • 3

运维经验
在这里插入图片描述
2、pipeline(流水线)
作用
在这里插入图片描述
使用pipeline

Jedis jedis = new Jedis("127.0.0.1",6379);
for(int i = 0;i < 100;i++){
	Pipeline pipeline = jedis.pepelined();
	for(int i = i*100;j <(i+1)*100;j++){
	pipeline.hset("hashkey:"+j,"field"+j,"value"+j);
	}
	pipeline.syncAndReturnAll();
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

使用建议
—注意每次pipeline携带数据量
—pipeline每次只能作用在一个Redis节点上
—M操作与pipeline操作的区别

3、发布订阅

**角色:**发布者(publisher)、频道(channel)、订阅者(subscriber)
模型(类似于生产者消费者模型)
在这里插入图片描述
API
publish channel message (发布命令)、subscribe 【channel](订阅)、unsubscribe、psubscribe(订阅模式)

消息队列
在这里插入图片描述
4、Bitmap(位图)

API
setbit key offset value (给位图指定索引设置值)、getbit、bitcount key [start end] (获取指定范围类的全部值为1的个数)、bitop、

5、HyperLogLog
介绍
在这里插入图片描述
三个命令
在这里插入图片描述
6、GEO(地理信息定位)
API
geo key longitude latitude member 、geopos key member (获取地理位置信息)、deodist key member1 member2(获取两个地理位置的距离)、georadius

五、Redis持久化的取舍和选择

1、持久化
什么是持久化

持久化:redis的所有数据保存在内存当中,对数据的更新操作将异步地保存到磁盘上

持久化的方式
快照-------------MySQL Dump 、Redis RDB
写日志----------------MySQL Binlong、Hbase HLog 、 Redis AOF

3、RDB

什么是RDB(快照备份恢复的文件)
在这里插入图片描述
触发机制–主要三种

save(同步)
如果存在老的RDB文件,新的替换它
复杂度 O(n)
在这里插入图片描述
bgsave(异步)
在这里插入图片描述
自动生成RDB

RDB总结
—RDB是Redis内存到硬盘的快照,用于持久化
—save通常会阻塞Redis
—bgsvae不会阻塞Redis,但是会fork新的进程
—save自动配置满足任何一条就会被执行
—有些触发机制不容忽视

4、AOF

RDB存在的问题

耗时、耗性能
在这里插入图片描述
不可控 容易丢失数据
在这里插入图片描述
AOF运行原理—恢复

AOF的三种策略

always
在这里插入图片描述everysec(每秒写入AOF文件中 发生故障还是会丢失一秒钟的数据)

在这里插入图片描述
no(根据操作系统来)
在这里插入图片描述
三种比较
在这里插入图片描述
AOF重写
AOF重写能减少硬盘占用量、加快恢复速度

AOF重写实现的两种方式

bgrewriteaof、AOF重写配置

AOF与RDB比较
在这里插入图片描述

六、Redis复制的原理与优化

1、单机问题
机器故障(高可用)、容量瓶颈、QPS瓶颈(f分布式)

2、主从复制
—主从复制能得到数据副本、扩展读的性能
—一个master可以有多个slave
—一个slave只能有一个master
—数据流向是单向的,master到slave

实现主从配置可以通过slaveof命令也可以修改配置

3、全量复制和部分复制(runId和偏移量)

全量复制开销
—bgsave时间、RDB文件网络传输时间、从节点清空数据的时间、从节点加载RDB的时间、可能AOF重写的时间

4、故障处理

主从结构----故障自动转移

slave宕掉、master宕掉

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/518299
推荐阅读
相关标签
  

闽ICP备14008679号