文章目录
- 内存式NoSQL数据库Redis(一)
- 知识点02:NoSQL与RDBMS
- 知识点03:Redis的功能与应用场景
- 知识点04:Redis的Windows版单机部署
- 知识点05:Redis的桌面工具
- 知识点06:Redis的Linux版单机部署
- 知识点07:Redis的数据结构及数据类型
- 知识点08:Redis的通用命令
- 知识点09:String类型的常用命令
- 知识点10:Hash类型的常用命令
- 知识点11:List类型的常用命令
- 知识点12:Set类型的常用命令
- 知识点13:Zset类型的常用命令
- 知识点14:BitMap类型的常用命令
- 知识点15:HyperLogLog类型的常用命令
- 知识点16:Jedis:使用方式与Jedis依赖
- 知识点17:Jedis:构建连接
- 知识点18:Jedis:String操作
- 知识点19:Jedis:Hash操作
- 知识点20:Jedis:List操作
- 知识点21:Jedis:Set操作
- 知识点22:Jedis:Zset操作
- 附录一:Jedis Maven依赖
内存式NoSQL数据库Redis(一)
知识点02:NoSQL与RDBMS
-
目标:了解NoSQL的应用场景与RDBMS的区别
-
路径
- step1:RDBMS的特点
- step2:业务架构中的问题
- step3:NoSQL的特点
-
实施
-
RDBMS的特点:关系型数据库管理系统
- 工具:MySQL、Oracle、SQL Server……
- 应用:业务性数据存储系统:事务和稳定性
- 特点:体现数据之间的关系,支持事务,保证业务完整性和稳定性,小数据量的性能也比较好
- 开发:SQL
-
业务架构中的问题
-
问题:以网站后台存储为例,当并发量很大,所有高并发全部直接请求MySQL,容易导致MySQL奔溃
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gVeUymWT-1624621684837)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519220356711.png)]
-
需求:能实现高并发的数据库,接受高并发请求
-
-
NoSQL的特点:Not Only SQL:非关系型数据库
-
工具:Redis、HBASE、MongoDB……
-
应用:一般用于高并发高性能场景下的数据缓存或者数据库存储
-
特点:读写速度特别快,并发量非常高,相对而言不如RDBMS稳定,对事务性的支持不太友好
-
开发:每种NoSQL都有自己的命令语法
-
解决上面RDBMS的问题:实现读写分离
- 读请求:读请求不读取MySQL,读取Redis
- 写请求:写请求直接写入MySQL
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LmjGVTk0-1624621684838)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519220547502.png)]
-
-
-
小结
- RDBMS和NoSQL的应用特点分别是什么?
- RDBMS:业务性数据存储
- 支持事务、更加稳定和安全、小数据量和低并发的场景下性能比较高
- NoSQL:高并发和高性能的数据存储
- 读写速度比较快,支持高并发读写,事务支持不完美,稳定性和安全性相对较差
知识点03:Redis的功能与应用场景
-
目标:掌握Redis的功能与应用场景
-
路径
- step1:介绍
- step2:功能特点
- step3:应用场景
-
实施
-
介绍
-
相关网站
-
官方介绍
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
-
定义:基于内存的分布式的NoSQL数据库
- 所有数据存储在内存中,并且有持久化机制
- 每次redis重启,会从文件中重新加载数据到内存,所有读写都只基于内存
-
-
功能特点
- 功能:提供高性能高并发的数据存储
- 特点
- 基于C语言开发的系统,与硬件的交互性能更好
- 基于内存实现数据读写,读写性能更快
- 分布式的、扩展性和稳定性更好
- 支持事务、拥有各种丰富的数据结构
- String:类似于Java中的字符串
- Hash:类似于Java中Map集合
- List:有序可重复的元素集合
- Set:无序且不可重复的元素集合,一般用于去重
- Zset:Sorted Set,有序且不可重复
-
应用场景
- 缓存:用于实现大数据量高并发的大数据量缓存【临时性存储】
- 数据库:用于实现高性能的小数据量读写【永久性存储】
- 消息中间件:消息队列【MQ】:用于实现消息传递,一般不用
-
-
小结
- Redis的功能与应用场景是什么?
- 功能:实现高性能高并发的数据读写
- 特点
- 基于C语言
- 数据读写只读写内存
- 分布式架构
- 支持多种数据类型
- 应用
- 缓存:适合于高并发大数据量的数据缓存
- 数据库:适合于高性能小数据量的持久性存储
- 消息队列:一般不用
- Redis的功能与应用场景是什么?
知识点04:Redis的Windows版单机部署
-
目标:实现Redis的Windows版单机部署
-
路径
- step1:Redis的版本
- step2:Window版部署
- step3:测试
-
实施
-
Redis的版本
- 3.x:支持了分片集群功能
- 5.x:分片集群的功能稳定了
-
Window版部署
-
step1:找到Windows版本的安装包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vKePcskK-1624621684840)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222131139.png)]
-
step2:将安装包直接解压,解压到一个没有中文的路径,路径不要太深
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MicnrFfW-1624621684840)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222153470.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7LLbeWeJ-1624621684841)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222215966.png)]
-
命令目录结构
目录或文件 作用 redis-benchmark.exe redis的性能测试工具 redis-check-aof.exe aof文件的检查和修复工具 redis-check-dump.exe rdb文件的检查和修复工具 redis-cli.exe client 客户端访问命令 redis-server.exe 服务器启动程序 redis.window.conf 配置文件,这是个文本文件
-
-
启动测试
-
step1:启动Redis服务端
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8HtU5C95-1624621684842)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222228782.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K975E52a-1624621684842)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222234731.png)]
-
step2:启动Redis客户端
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F1SzrxsA-1624621684842)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222242697.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CNTU4oBT-1624621684843)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222720294.png)]
-
step3:执行测试命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DoD3hKyA-1624621684843)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210621104318425.png)]
-
-
-
小结
- 实现Redis的Windows版单机部署
知识点05:Redis的桌面工具
-
目标:了解Reids桌面工具的使用
-
实施
-
解压安装
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kAwxX1OZ-1624621684844)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519223118049.png)]
-
启动连接
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RTkFpGdD-1624621684844)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519223231864.png)]
-
-
小结
- 了解Reids桌面工具的使用
知识点06:Redis的Linux版单机部署
-
目标:实现Redis的Linux版单机部署
-
实施
-
上传源码
cd /export/software/ rz
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hIGvqaI5-1624621684844)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210521102236816.png)]
-
解压
tar -zxvf redis-3.2.8.tar.gz -C /export/server/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hLch5KWs-1624621684844)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210521102259929.png)]
-
安装依赖
yum -y install gcc-c++ tcl
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A6IWQBp0-1624621684845)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210521102417864.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HQUGTlwS-1624621684846)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210521102518266.png)]
-
编译安装
#进入源码目录 cd /export/server/redis-3.2.8/ #编译 make #安装,并指定安装目录 make PREFIX=/export/server/redis-3.2.8-bin install
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CWsB545h-1624621684846)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210521102629002.png)]
-
修改配置
-
复制配置文件
cp /export/server/redis-3.2.8/redis.conf /export/server/redis-3.2.8-bin/
-
创建目录
#redis日志目录 mkdir -p /export/server/redis-3.2.8-bin/logs #redis数据目录 mkdir -p /export/server/redis-3.2.8-bin/datas
-
修改配置
cd /export/server/redis-3.2.8-bin/ vim redis.conf
## 61行,配置redis服务器接受链接的网卡 bind node1 ## 128行,redis是否后台运行,设置为yes daemonize yes ## 163行,设置redis服务日志存储路径 logfile "/export/server/redis-3.2.8-bin/logs/redis.log" ## 247行,设置redis持久化数据存储目录 dir /export/server/redis-3.2.8-bin/datas/
-
创建软连接
cd /export/server ln -s redis-3.2.8-bin redis
-
配置环境变量
vim /etc/profile
# REDIS HOME export REDIS_HOME=/export/server/redis export PATH=:$PATH:$REDIS_HOME/bin
source /etc/profile
-
-
启动
-
启动服务端
-
启动命令
/export/server/redis/bin/redis-server /export/server/redis/redis.conf
-
启动脚本
vim /export/server/redis/bin/redis-start.sh
#!/bin/bash REDIS_HOME=/export/server/redis ${REDIS_HOME}/bin/redis-server ${REDIS_HOME}/redis.conf
chmod u+x /export/server/redis/bin/redis-start.sh
-
-
启动客户端
/export/server/redis/bin/redis-cli -h node1 -p 6379
-
关闭客户端
- exit:退出客户端
-
关闭服务端
-
方式一:客户端中
shutdown
-
方式二:Linux命令行
kill -9 redis的pid
-
方式三:通过客户端命令进行关闭
bin/redis-cli -h node1 -p 6379 shutdown
-
-
-
测试
node1:6379> keys * (empty list or set) node1:6379> set s1 hadoop OK node1:6379> keys * 1) "s1" node1:6379> get s1 "hadoop" node1:6379>
-
-
小结
- 实现Redis的Linux版单机部署
知识点07:Redis的数据结构及数据类型
-
目标:掌握Redis的数据结构及数据类型
-
路径
- step1:数据结构
- step2:数据类型
-
实施
-
数据结构
-
整个Reids中所有数据以KV结构形式存在
-
K:作为唯一标识符,唯一标识一条数据,固定为String类型
-
V:真正存储的数据,可以有多种类型
- String、Hash、List、Set、Zset、BitMap、HypeLogLog
-
理解Redis:类似于Java中的一个Map集合,可以存储多个KV,根据K获取V
-
-
-
数据类型
- 每一种类型的应用场景和命令都是不一样的
Key:String Value类型 Value值 应用场景 pv_20200101 String 10000 一般用于存储单个数据指标的结果 person001 Hash name:laoer age : 20 sex female 用于存储整个对象所有属性值 uv List {100,200,300,100,600} 有序允许重复的集合,每天获取最后一个值 uv_20200101 Set {userid1,userid2,userid3,userid4……} 无序且不重复的集合,直接通过长度得到UV top10_product ZSet【score,element】 {10000-牙膏,9999-玩具,9998-电视……} 有序不可重复的集合,统计TopN user_filter BitMap {0101010101010000000011010} 将一个字符串构建位,通过0和1来标记每一位 product_20200101 HypeLogLog {productid1,id2……} 类似于Set集合,底层实现原理不一样,数据量大的情况下,性能会更好,结果可能存在一定的误差 -
String类型
- KV:【String,String】,类似于Java中Map集合的一条KV
-
Hash类型
- KV:【String,Map集合】:Map集合的嵌套,Map集合中的元素是无序的
-
List类型
- KV:【String,List】:有序且可重复
-
Set类型
- KV:【String,Set】:无序且不重复
-
Zset类型
- KV:【String,TreeMap集合】:Value也类似于Map集合,有序的Map集合
- 类似于List和Set集合特点的合并:有序且不可重复
-
小结
- Redis中的数据是什么结构以及有哪些类型?
- 数据结构:KV结构
- 类型
- K:String
- V
- String:字符串
- Hash:类似于Map集合
- List:类似于List集合
- Set:类似于Set集合
- Zset:有序不重复的Set集合
- BitMap:位图
- HyperLogLogs:类似于Set,适合于数据量大的场景,有一定的结果误差
- Redis中的数据是什么结构以及有哪些类型?
知识点08:Redis的通用命令
-
目标:掌握Redis常用的通用命令
-
实施
-
keys:列举当前数据库中所有Key
-
语法:keys 通配符
node1:6379> keys * 1) "s1" node1:6379> get s1 "hadoop" node1:6379> set str2 spark OK node1:6379> keys * 1) "str2" 2) "s1" node1:6379> keys st* 1) "str2" node1:6379>
-
-
del key:删除某个KV
-
exists key :判断某个Key是否存在
-
type key:判断这个K对应的V的类型的
-
expire K 过期时间:设置某个K的过期时间,一旦到达过期时间,这个K会被自动删除
-
ttl K:查看某个K剩余的存活时间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aymZp6Sd-1624621684846)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210621115251230.png)]
-
select N:切换数据库的
- Redis默认由16个数据:db0 ~ db15,个数可以通过配置文件修改,名称不能改
- Redis是一层数据存储结构:所有KV直接存储在数据库中
- 默认进入db0
-
move key N:将某个Key移动到某个数据库中
-
flushdb:清空当前数据库的所有Key
-
flushall:清空所有数据库的所有Key
-
-
小结
- 掌握Redis常用的通用命令
知识点09:String类型的常用命令
-
目标:掌握String类型的常用命令
-
实施
- set:给String类型的Value的进行赋值或者更新
- 语法:set K V
- get:读取String类型的Value的值
- 语法:get K
- mset:用于批量写多个String类型的KV
- 语法:mset K1 V1 K2 V2 ……
- mget:用于批量读取String类型的Value
- 语法:mget K1 K2 K3 ……
- setnx:只能用于新增数据,当K不存在时可以进行新增
- 语法:setnx K V
- 应用:构建抢占锁,搭配expire来使用
- incr:用于对数值类型的字符串进行递增,递增1,一般用于做计数器
- 语法:incr K
- incrby:指定对数值类型的字符串增长固定的步长
- 语法:incrby K N
- decr:对数值类型的数据进行递减,递减1
- 语法:decr K
- decrby:按照指定步长进行递减
- 语法:decrby K N
- incrbyfloat:基于浮点数递增
- 语法:incrbyfloat K N
- strlen:统计字符串的长度
- 语法:strlen K
- getrange:用于截取字符串
- 语法:getrange s2 start end
node1:6379> set s1 hadoop OK node1:6379> keys * 1) "s1" node1:6379> get s1 "hadoop" node1:6379> set s1 hive OK node1:6379> get s1 "hive" node1:6379> key * (error) ERR unknown command 'key' node1:6379> keys * 1) "s1" node1:6379> mset s2 oozie s3 hue OK node1:6379> keys * 1) "s2" 2) "s3" 3) "s1" node1:6379> mget s1 s3 1) "hive" 2) "hue" node1:6379> setnx s4 spark (integer) 1 node1:6379> keys * 1) "s4" 2) "s2" 3) "s3" 4) "s1" node1:6379> get s4 "spark" node1:6379> setnx s4 flink (integer) 0 node1:6379> get s4 "spark" node1:6379> set s5 1 OK node1:6379> incr s5 (integer) 2 node1:6379> get s5 "2" node1:6379> incrby s5 5 (integer) 7 node1:6379> get s5 "7" node1:6379> decr s5 (integer) 6 node1:6379> decrby s5 2 (integer) 4 node1:6379> get s5 "4" node1:6379> set s6 19.5 OK node1:6379> get s6 "19.5" node1:6379> incrbyfloat s6 2.4 "21.9" node1:6379> strlen s1 (integer) 4 node1:6379> get s1 "hive" node1:6379> get s4 "spark" node1:6379> strlen s4 (integer) 5 node1:6379> getrange s4 0 1 "sp" node1:6379> getrange s4 0 3 "spar"
- set:给String类型的Value的进行赋值或者更新
-
小结
- 掌握String类型的常用命令
知识点10:Hash类型的常用命令
-
目标:掌握Hash类型的常用命令
-
实施
-
hset:用于为某个K添加一个属性
- 语法:hset K k v
-
hget:用于获取某个K的某个属性的值
- 语法:hget K k
-
hmset:批量的为某个K赋予新的属性
-
语法:hmset K k1 v1 k2 v2 ……
-
hmget:批量的获取某个K的多个属性的值
- 语法:hmget K k1 k2 k3……
-
hgetall:获取所有属性的值
- 语法:hgetall K
-
hdel:删除某个属性
- 语法:hdel K k1 k2 ……
-
hlen:统计K对应的Value总的属性的个数
- 语法:hlen K
-
hexists:判断这个K的V中是否包含这个属性
- 语法:hexists K k
-
hvals:获取所有属性的value的
-
语法:hvals K
node1:6379> hset m1 name laoda (integer) 1 node1:6379> hset m1 age 18 (integer) 1 node1:6379> hget m1 name "laoda" node1:6379> hget m1 age "18" node1:6379> hmset m2 name laoer age 20 sex male OK node1:6379> keys * 1) "s5" 2) "s1" 3) "s2" 4) "s4" 5) "m1" 6) "s3" 7) "m2" 8) "s6" node1:6379> hmget m2 name sex 1) "laoer" 2) "male" node1:6379> hgetall m2 1) "name" 2) "laoer" 3) "age" 4) "20" 5) "sex" 6) "male" node1:6379> del m1 (integer) 1 node1:6379> keys * 1) "s5" 2) "s1" 3) "s2" 4) "s4" 5) "s3" 6) "m2" 7) "s6" node1:6379> hdel m2 name (integer) 1 node1:6379> hgetall m2 1) "age" 2) "20" 3) "sex" 4) "male" node1:6379> hlen m2 (integer) 2 node1:6379> hexists m2 name (integer) 0 node1:6379> hexists m2 age (integer) 1 node1:6379> hvals m2 1) "20" 2) "male" node1:6379>
-
-
小结
- 掌握Hash类型的常用命令
知识点11:List类型的常用命令
-
目标:掌握List类型的常用命令
-
实施
-
lpush:将每个元素放到集合的左边,左序放入
- 语法:lpush K e1 e2 e3……
-
rpush:将每个元素放到集合的右边,右序放入
- 语法:rpush K e1 e2 e3……
-
lrange:通过下标的范围来获取元素的数据
-
语法:lrange K start end
-
注意:从左往右的下标从0开始,从右往左的下标从-1开始,一定是从小的到大的下标
-
lrange K 0 -1:所有元素
-
-
llen:统计集合的长度
- 语法:llen K
-
lpop:删除左边的一个元素
- 语法:lpop K
-
rpop:删除右边的一个元素
- 语法:rpop K
node1:6379> lpush list1 1 2 3 3 (integer) 4 node1:6379> rpush list1 4 5 6 7 7 (integer) 9 node1:6379> lrange list1 0 8 1) "3" 2) "3" 3) "2" 4) "1" 5) "4" 6) "5" 7) "6" 8) "7" 9) "7" node1:6379> lrange list1 0 100 1) "3" 2) "3" 3) "2" 4) "1" 5) "4" 6) "5" 7) "6" 8) "7" 9) "7" node1:6379> llen list1 (integer) 9 node1:6379> lrange list1 0 -1 1) "3" 2) "3" 3) "2" 4) "1" 5) "4" 6) "5" 7) "6" 8) "7" 9) "7" node1:6379> lrange list1 0 4 1) "3" 2) "3" 3) "2" 4) "1" 5) "4" node1:6379> lrange list1 -9 -5 1) "3" 2) "3" 3) "2" 4) "1" 5) "4" node1:6379> lrange list1 0 -1 1) "3" 2) "3" 3) "2" 4) "1" 5) "4" 6) "5" 7) "6" 8) "7" 9) "7" node1:6379> lpop list1 "3" node1:6379> lrange list1 0 -1 1) "3" 2) "2" 3) "1" 4) "4" 5) "5" 6) "6" 7) "7" 8) "7" node1:6379> rpop list1 "7" node1:6379> lrange list1 0 -1 1) "3" 2) "2" 3) "1" 4) "4" 5) "5" 6) "6" 7) "7" node1:6379>
-
-
小结
- 掌握List类型的常用命令
知识点12:Set类型的常用命令
-
目标:掌握Set类型的常用命令
-
实施
-
sadd:用于添加元素到Set集合中
- 语法:sadd K e1 e2 e3 e4 e5……
-
smembers:用于查看Set集合的所有成员
- 语法:smembers K
-
sismember:判断是否包含这个成员
- 语法:sismember K e1
-
srem:删除其中某个元素
- 语法:srem K e
-
scard:统计集合长度
- 语法:scard K
-
sunion:取两个集合的并集
- 语法:sunion K1 K2
-
sinter:取两个集合的交集
- 语法:sinter K1 K2
-
node1:6379> sadd set1 1 3 2 1 4 2 1 9 8
(integer) 6
node1:6379> sadd set1 1 5
(integer) 1
node1:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "8"
7) "9"
node1:6379> sismember set1 1
(integer) 1
node1:6379> sismember set1 6
(integer) 0
node1:6379> srem set1 1 5
(integer) 2
node1:6379> smembers set1
1) "2"
2) "3"
3) "4"
4) "8"
5) "9"
node1:6379> scard set1
(integer) 5
node1:6379>
node1:6379> smembers set1
1) "2"
2) "3"
3) "4"
4) "8"
5) "9"
node1:6379> sadd set2 3 1 2 9 9 3
(integer) 4
node1:6379> smembers set2
1) "1"
2) "2"
3) "3"
4) "9"
node1:6379> sinter set1 set2
1) "2"
2) "3"
3) "9"
node1:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "8"
6) "9"
-
小结
- 掌握Set类型的常用命令
知识点13:Zset类型的常用命令
-
目标:掌握Zset类型的常用命令
-
实施
-
zadd:用于添加元素到Zset集合中
- 语法:zadd K score1 k1 score2 k2 ……
-
zrange:范围查询
- 语法:zrange K start end [withscores]
-
zrevrange:倒序查询
- 语法:zrevrange K start end [withscores]
-
zrem:移除一个元素
- 语法:zrem K k1
-
zcard:统计集合长度
- 语法:zcard K
-
zscore:获取评分
- 语法:zscore K k
node1:6379> zadd zset1 20.9 yuwen 17.5 yinyu 99.7 shuxue 60.0 dili (integer) 4 node1:6379> zrange zset1 0 -1 1) "yinyu" 2) "yuwen" 3) "dili" 4) "shuxue" node1:6379> zrevrange zset1 0 -1 1) "shuxue" 2) "dili" 3) "yuwen" 4) "yinyu" node1:6379> zrange zset1 0 -1 withscores 1) "yinyu" 2) "17.5" 3) "yuwen" 4) "20.899999999999999" 5) "dili" 6) "60" 7) "shuxue" 8) "99.700000000000003" node1:6379> zrem zset1 dili (integer) 1 node1:6379> zrange zset1 0 -1 withscores 1) "yinyu" 2) "17.5" 3) "yuwen" 4) "20.899999999999999" 5) "shuxue" 6) "99.700000000000003" node1:6379> zcard zset1 (integer) 3 node1:6379> zscore zset1 shuxue "99.700000000000003"
-
-
小结
- 掌握Zset类型的常用命令
知识点14:BitMap类型的常用命令
-
目标:掌握BitMap类型的常用命令
-
实施
-
功能:通过一个String对象的存储空间,来构建位图,用每一位0和1来表示状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b5P6V71i-1624621684846)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210520075811401.png)]
-
Redis中一个String最大支持512M = 2^32次方,1字节 = 8位
-
使用时,可以指定每一位对应的值,要么为0,要么为1,默认全部为0
-
用下标来标记每一位,第一个位的下标为0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E6W5JMcc-1624621684847)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210520075824978.png)]
-
-
举例:统计UV
-
一个位图中包含很多位,可以用每一个位表示一个用户id
-
读取数据,发现一个用户id,就将这个用户id对应的那一位改为1
-
统计整个位图中所有1的个数,就得到了UV
-
-
setbit:修改某一位的值
-
语法:setbit bit1 位置 0/1
setbit bit1 0 1
-
-
getbit:查看某一位的值
-
语法:getbit K 位置
getbit bit1 9
-
-
bitcount:用于统计位图中所有1的个数
-
语法:bitcount K [start end]
bitcount bit1 #start和end表示的是字节 bitcount bit1 0 10
-
-
bitop:用于位图的运算:and/or/not/xor
-
语法:bitop and/or/xor/not bitrs bit1 bit2
bitop and bit3 bit1 bit2 bitop or bit4 bit1 bit2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fkGr6VTY-1624621684848)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210520080018074.png)]
-
node1:6379> setbit bit1 0 1 (integer) 0 node1:6379> getbit bit1 0 (integer) 1 node1:6379> getbit bit1 1 (integer) 0 node1:6379> getbit bit1 2 (integer) 0 node1:6379> setbit bit1 5 1 (integer) 0 node1:6379> getbit bit1 5 (integer) 1 node1:6379> setbit bit1 13 1 (integer) 0 node1:6379> getbit bit1 13 (integer) 1 node1:6379> bitcount bit1 (integer) 3 node1:6379> bitcount bit1 0 1 (integer) 3 node1:6379> bitcount bit1 0 0 (integer) 2 node1:6379> setbit bit2 0 1 (integer) 0 node1:6379> setbit bit2 1 1 (integer) 0 node1:6379> bitop and bit3 bit1 bit2 (integer) 2 node1:6379> bitcount bit3 (integer) 1 node1:6379> bitop or bit4 bit1 bit2 (integer) 2 node1:6379> bitcount bit4 (integer) 4 node1:6379>
-
-
小结
- 掌握BitMap类型的常用命令
知识点15:HyperLogLog类型的常用命令
-
目标:掌握HyperLogLog类型的常用命令
-
实施
-
功能:类似于Set集合,用于实现数据的去重
-
区别:底层实现原理不一样
-
应用:适合于数据量比较庞大的情况下的使用,存在一定的误差率
-
-
pfadd:用于添加元素
-
语法:pfadd K e1 e2 e3……
pfadd pf1 userid1 userid1 userid2 userid3 userid4 userid3 userid4
-
-
pfcount:用于统计个数
-
语法:pfcount K
pfcount pf1
-
-
pfmerge:用于实现集合合并
-
语法:pfmerge pfrs pf1 pf2……
pfmerge pf3 pf1 pf2
node1:6379> pfadd pf1 userid1 userid1 userid2 userid3 userid4 userid3 userid4 (integer) 1 node1:6379> pfcount pf1 (integer) 4 node1:6379> pfadd pf2 userid1 userid1 userid3 userid4 userid3 userid4 userid5 (integer) 1 node1:6379> pfmerge pf3 pf1 pf2 OK node1:6379> pfcount pf3 (integer) 5 node1:6379>
-
-
-
小结
- 掌握HyperLogLog类型的常用命令
知识点16:Jedis:使用方式与Jedis依赖
-
目标:掌握Redis的使用方式及构建Jedis工程依赖
-
路径
- step1:Redis的使用方式
- step2:Jedis依赖
-
实施
-
Redis的使用方式
- 命令操作Redis,一般用于测试开发阶段
-
-
分布式计算或者Java程序读写Redis,一般用于实际生产开发
-
Jedis依赖
-
构建模块
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KUg3Cmxz-1624621684848)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210521144852519.png)]
-
参考附录一添加依赖
-
-
-
小结
- 掌握Redis的使用方式及构建Jedis工程依赖
知识点17:Jedis:构建连接
-
目标:实现Jedis的客户端连接
-
实施
//todo:1-构建连接对象 Jedis jedis = null; @Before public void getConnection(){ //方式一:直接构建Jedis对象 // jedis = new Jedis("node1",6379); //方式二:通过连接池构建Jedis //构建连接池配置对象 JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(10);//总连接构建 config.setMaxIdle(5);//最大空闲连接 config.setMinIdle(2);//最小空闲连接 //构建连接池对象 JedisPool jedisPool = new JedisPool(config,"node1",6379); //获取连接 jedis = jedisPool.getResource(); } //todo:2-调用连接对象的方法实现操作 //todo:3-释放连接 @After public void closeConnection(){ jedis.close(); }
-
小结
- 实现Jedis的客户端连接
知识点18:Jedis:String操作
-
目标:Jedis中实现String的操作
-
实施
set/get/incr/exists/expire/setexp/ttl
@Test public void testString(){ //set/get/incr/exists/expire/setexp/ttl // jedis.set("s1","hadoop"); // System.out.println(jedis.exists("s1")); // System.out.println(jedis.exists("s2")); // System.out.println(jedis.get("s1")); // jedis.set("s2","3"); // jedis.incr("s2"); // System.out.println(jedis.get("s2")); // jedis.expire("s2",10); // while(true){ // System.out.println(jedis.ttl("s2")); // } //setex:构建KV时,直接设置生命周期 jedis.setex("s3",10,"oozie"); }
-
小结
- Jedis中实现String的操作
知识点19:Jedis:Hash操作
-
目标:Jedis中实现Hash的操作
-
实施
hset/hmset/hget/hgetall/hdel/hlen/hexists
public void testHash(){ //hset/hmset/hget/hgetall/hdel/hlen/hexists jedis.hset("m1","name","zhangsan"); System.out.println(jedis.hget("m1","name")); Map<String,String> maps = new HashMap<>(); maps.put("age","18"); maps.put("phone","110"); jedis.hmset("m1",maps); List<String> hmget = jedis.hmget("m1", "name", "age"); System.out.println(hmget); System.out.println("==================================="); Map<String, String> m1 = jedis.hgetAll("m1"); for(Map.Entry map : m1.entrySet()){ System.out.println(map.getKey()+"\t"+map.getValue()); } System.out.println("==================================="); System.out.println(jedis.hlen("m1")); jedis.hdel("m1","name"); System.out.println(jedis.hlen("m1")); System.out.println(jedis.hexists("m1","name")); System.out.println(jedis.hexists("m1","age")); }
-
小结
- Jedis中实现Hash的操作
知识点20:Jedis:List操作
-
目标:Jedis中实现List的操作
-
实施
lpush/rpush/lrange/llen/lpop/rpop
@Test public void testList(){ //lpush/rpush/lrange/llen/lpop/rpop jedis.lpush("list1","1","2","3"); System.out.println(jedis.lrange("list1",0,-1)); jedis.rpush("list1","4","5","6"); System.out.println(jedis.lrange("list1",0,-1)); System.out.println(jedis.llen("list1")); jedis.lpop("list1"); jedis.rpop("list1"); System.out.println(jedis.lrange("list1",0,-1)); }
-
小结
- Jedis中实现List的操作
知识点21:Jedis:Set操作
-
目标:Jedis中实现Set的操作
-
实施
sadd/smembers/sismember/scard/srem
@Test public void testSet(){ //sadd/smembers/sismember/scard/srem jedis.sadd("set1","1","2","3","1","2","3","4","5","6"); System.out.println("长度:"+jedis.scard("set1")); System.out.println("内容:"+jedis.smembers("set1")); System.out.println(jedis.sismember("set1","1")); System.out.println(jedis.sismember("set1","7")); jedis.srem("set1","2"); System.out.println("内容:"+jedis.smembers("set1")); }
-
小结
- Jedis中实现Set的操作
知识点22:Jedis:Zset操作
-
目标:Jedis中实现Zset的操作
-
实施
zadd/zrange/zrevrange/zcard/zrem
@Test public void testZset(){ //zadd/zrange/zrevrange/zcard/zrem jedis.zadd("zset1",20.9,"yuwen"); jedis.zadd("zset1",10.5,"yinyu"); jedis.zadd("zset1",70.9,"shuxue"); jedis.zadd("zset1",99.9,"shengwu"); Set<String> zset1 = jedis.zrange("zset1", 0, -1); System.out.println(zset1); System.out.println(jedis.zrevrange("zset1",0,-1)); System.out.println(jedis.zcard("zset1")); jedis.zrem("zset1","yuwen"); System.out.println(jedis.zrangeWithScores("zset1",0,-1)); }
-
小结
- Jedis中实现Zset的操作
附录一:Jedis Maven依赖
<properties>
<jedis.version>3.2.0</jedis.version>
</properties>
<dependencies>
<!-- Jedis 依赖 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<!-- JUnit 4 依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
dd(“zset1”,10.5,“yinyu”);
jedis.zadd(“zset1”,70.9,“shuxue”);
jedis.zadd(“zset1”,99.9,“shengwu”);
Set zset1 = jedis.zrange(“zset1”, 0, -1);
System.out.println(zset1);
System.out.println(jedis.zrevrange(“zset1”,0,-1));
System.out.println(jedis.zcard(“zset1”));
jedis.zrem(“zset1”,“yuwen”);
System.out.println(jedis.zrangeWithScores(“zset1”,0,-1));
}
- **小结**
- Jedis中实现Zset的操作
## 附录一:Jedis Maven依赖
```xml
<properties>
<jedis.version>3.2.0</jedis.version>
</properties>
<dependencies>
<!-- Jedis 依赖 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<!-- JUnit 4 依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>