内存式NoSQL数据库Redis(一)
知识点01:课程目标
-
NoSQL与RDBMS区别
-
技术层次区别
-
应用层次区别
-
-
Redis的介绍
-
功能
-
应用场景
-
特点
-
-
Redis的使用【重点】
-
命令行的使用方式:支持各种增删改查
-
Jedis:Java操作Redis API
-
知识点02:NoSQL与RDBMS
-
目标:了解NoSQL的应用场景与RDBMS的区别
-
路径
-
step1:RDBMS的特点
-
step2:业务架构中的问题
-
step3:NoSQL的特点
-
-
实施
-
RDBMS的特点:关系型数据库管理系统(Relational Database Management System:RDBMS)
-
工具:MySQL、Oracle、SQL Server……
-
应用:业务性数据存储系统:事务和稳定性
-
特点:体现数据之间的关系,支持事务,保证业务完整性和稳定性,小数据量的性能也比较好
-
开发:SQL
-
-
业务架构中的问题
-
问题:以网站后台存储为例,当并发量很大,所有高并发全部直接请求MySQL,容易导致MySQL奔溃
-
需求:能实现高并发的数据库,接受高并发请求
-
-
NoSQL的特点:Not Only SQL:非关系型数据库
-
工具:Redis、HBASE、MongoDB……
-
应用:一般用于高并发高性能场景下的数据缓存或者数据库存储
-
特点:读写速度特别快,并发量非常高,相对而言不如RDBMS稳定,对事务性的支持不太友好
-
开发:每种NoSQL都有自己的命令语法
-
解决上面RDBMS的问题:实现读写分离
-
读请求:读请求不读取MySQL,读取Redis
-
写请求:写请求直接写入MySQL
-
-
-
-
小结
-
RDBMS的特点是什么?
-
应用:业务存储问题
-
-
特点:事务、稳定性和安全性、小数据量的性能比较好
-
NoSQL的特点是什么?
-
应用:高并发和高性能的问题
-
特点:数据量大的场景下读写速度快,并发量高
-
-
知识点03:Redis的功能与应用场景
-
目标:掌握Redis的功能与应用场景
-
路径
-
step1:介绍
-
step2:功能特点
-
step3:应用场景
-
-
实施
-
介绍
-
相关网站
-
官方网站:Redis、Index of /releases/
-
中文文档:redis中文官方网站
-
Redis 命令参考:Redis 命令参考 — Redis 命令参考
-
-
官方介绍
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数据库
-
-
功能特点
-
功能:提供高性能高并发的数据存储
-
特点
-
基于C语言开发的系统,与硬件的交互性能更好
-
基于内存实现数据读写,读写性能更快
-
分布式的、扩展性和稳定性更好
-
支持事务、拥有各种丰富的数据结构
-
-
-
应用场景
-
缓存:用于实现高并发的数据缓存
-
数据库:用于实现高性能的数据读写
-
场景
-
数据库:永久性存储,高性能的读写结果存储(在大数据领域中)
-
缓存:临时性存储,业务系统中作为缓存
-
消息中间件:消息队列MQ,Redis一般不用,我们专门有个Kafka可以用
-
-
-
-
小结
-
Redis的功能与应用场景是什么?
-
功能:提供高性能高并发分布式内存的存储
-
应用
-
缓存:高并发的读写
-
数据库:高性能的读写
-
-
特点:C语言、分布式、内存、支持事务、多种数据类型
-
-
知识点04:Redis的Windows版单机部署
-
目标:实现Redis的Windows版单机部署
-
路径
-
step1:Redis的版本
-
step2:Window版部署
-
step3:测试
-
-
实施
-
Redis的版本
-
3.x:支持了分片集群功能
-
5.x:分片集群的功能稳定了
-
-
Window版部署
-
step1:找到Windows版本的安装包
-
step2:将安装包直接解压,解压到一个没有中文的路径,路径不要太深
-
命令目录结构
目录或文件 作用 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服务端,端口为:6379
-
step2:启动Redis客户端
-
step3:执行测试命令
127.0.0.1:6379> set s1 hadoop OK 127.0.0.1:6379> keys * 1) "s1" 127.0.0.1:6379> set s2 hive OK 127.0.0.1:6379> keys * 1) "s2" 2) "s1" 127.0.0.1:6379> get s1 "hadoop" 127.0.0.1:6379> get s2 "hive" 127.0.0.1:6379>
-
-
-
小结
-
实现Redis的Windows版单机部署
-
知识点05:Redis的桌面工具
-
目标:了解Reids桌面工具的使用
-
实施
-
解压安装
-
启动连接
-
-
小结
-
了解Reids桌面工具的使用
-
知识点06:Redis的Linux版单机部署
-
目标:实现Redis的Linux版单机部署
-
实施
-
上传源码
cd /export/software/ rz
-
解压
tar -zxvf redis-3.2.8.tar.gz -C /export/server/
-
安装依赖
yum -y install gcc-c++ tcl
#此命令不用操作 #卸载依赖 yum -y remove gcc-c++ tcl
-
编译安装
#进入源码目录 cd /export/server/redis-3.2.8/ #编译 make #安装,并指定安装目录 make PREFIX=/export/server/redis-3.2.8-bin install
-
修改配置
-
复制配置文件
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
-
-
启动
-
启动服务端 (redis-start.sh)
-
查看服务端的进程(ps -ef |grep redis)
-
启动命令(redis-server /export/server/redis/redis.conf)启动服务端
/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
-
-
启动客户端(redis-cli -h node1 -p 6379)
/export/server/redis/bin/redis-cli -h node1 -p 6379
-
关闭客户端
-
exit:退出客户端
-
-
关闭服务端
-
方式一:客户端中
shutdown
-
方式二:Linux命令行
kill -9 redis的pid 一般服务端的进程的pid是会放在一个文件里的,Redis默认放在/var/run/redis_6379.pid 所以也可以这样关闭 kill -9 `cat /var/run/redis_6379.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集合
Map<String,T> = Redis存储
-
写:指定K和V
-
读:指定K
-
-
-
数据类型
-
每一种类型的应用场景和命令都是不一样的
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 {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集合中的元素是无序的
K V person1 name=zhangsan,age=18,sex=1,addr=shanghai person2 name=lisi,age=18,sex=1,addr=shanghai
-
-
List类型
-
KV:【String,List】:有序且可重复
-
-
Set类型
-
KV:【String,Set】:无序且不重复
-
-
Zset类型
-
KV:【String,TreeMap集合】:Value也类似于Map集合,有序的Map集合
-
类似于List和Set集合特点的合并:有序且不可重复
-
-
-
小结
-
Redis中的数据是什么结构?
-
KV结构
-
-
Redis中的数据类型有哪些?
-
K:String
-
V:String、Hash、List、Set、Zset、BitMap、HypeLogLog
-
-
知识点08:Redis的通用命令
-
目标:掌握Redis常用的通用命令
-
实施
-
keys:列举当前数据库中所有Key
-
语法:keys 通配符
-
-
del key:删除某个KV
-
exists key :判断某个Key是否存在
-
type key:判断这个K对应的V的类型的
-
expire K 过期时间:设置某个K的过期时间,一旦到达过期时间,这个K会被自动删除
一般用于验证码在一段时间内有效
-
ttl K:查看某个K剩余的存活时间
-
select N:切换数据库的
-
默认Redis有16个数据库,DB0 ~ DB15
-
默认自动进入0数据库
-
-
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
m是指 Multiple,意思为多个
-
语法:mget K1 K2 K3 ……
-
-
setnx:只能用于新增数据,当K不存在时可以进行新增
-
语法:setnx K V
-
应用:构建抢占锁,搭配expire来使用
-
-
incr:用于对数值类型的字符串进行递增,递增1
auto_increment increment 的缩写 increase
-
语法:incr K
-
-
incrby:指定对数值类型的字符串增长固定的步长
-
语法:incrby K N
-
-
decr:对数值类型的数据进行递减,递减1
decrease 减少
-
语法:decr K
-
-
decrby:按照指定步长进行递减
-
语法:decrby K N
-
-
incrbyfloat:基于浮点数递增
-
语法:incrbyfloat K N
-
-
strlen:统计字符串的长度
-
语法:strlen K
-
-
getrange:用于截取字符串
-
语法:getrange s2 start end
-
node1:6379> set s1 hive OK node1:6379> get s1 "hive" node1:6379> mset s2 spark s3 flink OK node1:6379> keys * 1) "s3" 2) "s2" 3) "s1" node1:6379> mget s1 s3 1) "hive" 2) "flink" node1:6379> setnx s4 oozie (integer) 1 node1:6379> keys * 1) "s3" 2) "s4" 3) "s2" 4) "s1" node1:6379> setnx s4 hive (integer) 0 node1:6379> get s4 "oozie" node1:6379> set s5 2 OK node1:6379> get s5 "2" node1:6379> incr s5 (integer) 3 node1:6379> get s5 "3" node1:6379> incrby s5 3 (integer) 6 node1:6379> get s5 "6" node1:6379> decr s5 (integer) 5 node1:6379> get s5 "5" node1:6379> decrby s5 2 (integer) 3 node1:6379> get s5 "3" node1:6379> set s6 20.5 OK node1:6379> get s6 "20.5" node1:6379> incrbyfloat s6 1.2 "21.7" node1:6379> strlen s1 (integer) 4 node1:6379> get s1 "hive" node1:6379> get s1 "hive" node1:6379> get s2 "spark" node1:6379> strlen s2 (integer) 5 node1:6379> getrange s2 0 2 "spa" node1:6379>
-
-
小结
-
掌握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> hget m1 name "laoda" node1:6379> hset m1 age 18 (integer) 1 node1:6379> hget m1 age "18" node1:6379> hmset m1 addr shanghai sex male OK node1:6379> hmget m1 name sex 1) "laoda" 2) "male" node1:6379> hgetall m1 1) "name" 2) "laoda" 3) "age" 4) "18" 5) "addr" 6) "shanghai" 7) "sex" 8) "male" node1:6379> hdel m1 sex (integer) 1 node1:6379> hgetall m1 1) "name" 2) "laoda" 3) "age" 4) "18" 5) "addr" 6) "shanghai" node1:6379> hlen m1 (integer) 3 node1:6379> hexists m1 name (integer) 1 node1:6379> hexists m1 sex (integer) 0 node1:6379> hgetall m1 1) "name" 2) "laoda" 3) "age" 4) "18" 5) "addr" 6) "shanghai" node1:6379> hvals m1 1) "laoda" 2) "18" 3) "shanghai"
-
小结
-
掌握Hash类型的常用命令
-
知识点11:List类型的常用命令
-
目标:掌握List类型的常用命令
-
实施
-
lpush:将每个元素放到集合的左边,左序放入
left 的缩写为 l push 进栈
-
语法:lpush K e1 e2 e3……
-
-
rpush:将每个元素放到集合的右边,右序放入
right 的缩写为 r push 进栈
-
语法:rpush K e1 e2 e3……
-
-
lrange:通过下标的范围来获取元素的数据
-
语法:lrange K start end
-
-
注意:从左往右的下标从0开始,从右往左的下标从-1开始,一定是从小的到大的下标
-
lrange K 0 -1:所有元素
-
llen:统计集合的长度
-
语法:llen K
-
-
lpop:删除左边的一个元素
left 的缩写为 l pop 出栈
-
语法:lpop K
-
-
rpop:删除右边的一个元素
right 的缩写为 r pop 出栈
-
语法:rpop K
node1:6379> lpush list1 1 2 3 4 (integer) 4 node1:6379> rpush list1 6 7 8 9 (integer) 8 node1:6379> rpush list1 1 2 (integer) 10 node1:6379> lrange list1 0 2 1) "4" 2) "3" 3) "2" node1:6379> lrange list1 0 9 1) "4" 2) "3" 3) "2" 4) "1" 5) "6" 6) "7" 7) "8" 8) "9" 9) "1" 10) "2" node1:6379> lrange list1 0 20 1) "4" 2) "3" 3) "2" 4) "1" 5) "6" 6) "7" 7) "8" 8) "9" 9) "1" 10) "2" node1:6379> llen list1 (integer) 10 node1:6379> lrange list1 0 -1 1) "4" 2) "3" 3) "2" 4) "1" 5) "6" 6) "7" 7) "8" 8) "9" 9) "1" 10) "2" node1:6379> lrange list1 -2 -1 1) "1" 2) "2" node1:6379> lrange list1 0 9 1) "4" 2) "3" 3) "2" 4) "1" 5) "6" 6) "7" 7) "8" 8) "9" 9) "1" 10) "2" node1:6379> lrange list1 -10 -1 1) "4" 2) "3" 3) "2" 4) "1" 5) "6" 6) "7" 7) "8" 8) "9" 9) "1" 10) "2" node1:6379> lpop list1 "4" node1:6379> lrange list1 0 -1 1) "3" 2) "2" 3) "1" 4) "6" 5) "7" 6) "8" 7) "9" 8) "1" 9) "2" node1:6379> rpop list1 "2" node1:6379> lrange list1 0 -1 1) "3" 2) "2" 3) "1" 4) "6" 5) "7" 6) "8" 7) "9" 8) "1" 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 0 1 3 1 4 0 5 9 1 (integer) 6 node1:6379> smembers set1 1) "0" 2) "1" 3) "3" 4) "4" 5) "5" 6) "9" node1:6379> sismember set1 2 (integer) 0 node1:6379> sismember set1 9 (integer) 1 node1:6379> srem set1 3 (integer) 1 node1:6379> smembers set1 1) "0" 2) "1" 3) "4" 4) "5" 5) "9" node1:6379> scard set1 (integer) 5 node1:6379> sadd set2 0 1 3 4 8 6 6 0 1 (integer) 6 node1:6379> sunion set1 set2 1) "0" 2) "1" 3) "3" 4) "4" 5) "5" 6) "6" 7) "8" 8) "9" node1:6379> sinter set1 set2 1) "0" 2) "1" 3) "4" node1:6379>
-
-
小结
-
掌握Set类型的常用命令
-
知识点13:Zset类型的常用命令
-
目标:掌握Zset类型的常用命令
-
实施
-
zadd:用于添加元素到Zset集合中
-
语法:zadd K score1 k1 score2 k2 ……
-
-
zrange:范围查询
-
语法:zrange K start end [withscores]
-
zrevrange:倒序查询
Reverse 的缩写 rev
-
-
语法:zrevrange K start end [withscores]
-
zrem:移除一个元素
-
语法:zrem K k1
-
zcard:统计集合长度
-
语法:zcard K
-
-
zscore:获取评分
-
语法:zscore K k
-
-
node1:6379> zadd zset1 30.5 yuwen 70.8 shuxue 12.7 yingyu 99.9 dili (integer) 4 node1:6379> zrange zset1 0 -1 1) "yingyu" 2) "yuwen" 3) "shuxue" 4) "dili" node1:6379> zrevrange zset1 0 -1 1) "dili" 2) "shuxue" 3) "yuwen" 4) "yingyu" node1:6379> zrange zset1 0 -1 withscores 1) "yingyu" 2) "12.699999999999999" 3) "yuwen" 4) "30.5" 5) "shuxue" 6) "70.799999999999997" 7) "dili" 8) "99.900000000000006" node1:6379> zrem zset1 shuxue (integer) 1 node1:6379> zrange zset1 0 -1 1) "yingyu" 2) "yuwen" 3) "dili" node1:6379> zcard zset1 (integer) 3 node1:6379> zscore zset1 yuwen "30.5" node1:6379>
-
小结
-
掌握Zset类型的常用命令
-
知识点14:BitMap类型的常用命令
-
目标:掌握BitMap类型的常用命令
-
实施
-
功能:通过一个String对象的存储空间,来构建位图,用每一位0和1来表示状态
-
Redis中一个String最大支持512M = 2^32次方,1字节 = 8位
-
使用时,可以指定每一位对应的值,要么为0,要么为1,默认全部为0
-
用下标来标记每一位,第一个位的下标为0
-
-
举例:统计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表示的是字节,1字节=8位 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
-
node1:6379> setbit bit1 0 1 (integer) 0 node1:6379> setbit bit1 9 1 (integer) 0 node1:6379> getbit bit1 0 (integer) 1 node1:6379> getbit bit1 1 (integer) 0 node1:6379> getbit bit1 9 (integer) 1 node1:6379> getbit bit1 10 (integer) 0 node1:6379> bitcount bit1 (integer) 2 node1:6379> bitcount bit1 0 1 (integer) 2 node1:6379> bitcount bit1 0 0 (integer) 1 node1:6379> setbit bit2 0 1 (integer) 0 node1:6379> setbit bit2 10 1 (integer) 0 node1:6379> bitop and bit3 bit1 bit2 (integer) 2 node1:6379> bitcount bit3 (integer) 1 node1:6379> getbit bit3 0 (integer) 1
-
-
小结
-
掌握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依赖
-
构建模块
-
参考附录一添加依赖
-
-
-
小结
-
掌握Redis的使用方式及构建Jedis工程依赖
-
知识点17:Jedis:构建连接
-
目标:实现Jedis的客户端连接
-
实施
//todo:1-构建连接 Jedis jedis = null; @Before public void getConnection(){ //方式一:直接构建一个连接对象 //实例化一个客户端连接对象,指定服务端地址 // jedis = new Jedis("node1",6379); //方式二:通过连接池来构建连接 //构建连接池,并且配置连接池属性 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(20);//最大连接数 jedisPoolConfig.setMaxIdle(10);//最大空闲连接 jedisPoolConfig.setMaxWaitMillis(1500);//最大等待时间 //构建连接池:连接池配置对象,主机名,端口 JedisPool jedisPool = new JedisPool(jedisPoolConfig,"node1",6379); //从连接池中获取连接对象 jedis = jedisPool.getResource(); } //todo:3-释放连接 @After public void close(){ jedis.close(); }
-
小结
-
实现Jedis的客户端连接
-
知识点18:Jedis:String操作
-
目标:Jedis中实现String的操作
-
实施
set/get/incr/exists/expire/setexp/ttl
@Test public void stringTest(){ //set/get/incr/setex/expire/ttl/exists // jedis.set("s1","hadoop"); // String s1 = jedis.get("s1"); // System.out.println(s1); // jedis.set("s2","2"); // jedis.incr("s2"); // String s2 = jedis.get("s2"); // System.out.println(s2); // jedis.expire("s2",20); // while(true){ // System.out.println(jedis.ttl("s2")); // } // System.out.println(jedis.exists("s1")); // System.out.println(jedis.exists("s2")); jedis.setex("s2",10,"hive"); }
-
小结
-
Jedis中实现String的操作
-
知识点19:Jedis:Hash操作
-
目标:Jedis中实现Hash的操作
-
实施
hset/hmset/hget/hgetall/hdel/hlen/hexists
@Test public void hashTest(){ //hset/hmset/hget/hgetall/hdel/hlen/hexists // jedis.hset("m1","name","zhangsan"); // String name = jedis.hget("m1", "name"); // System.out.println(name); // System.out.println("=========================="); // Map<String,String> maps = new HashMap<>(); // maps.put("age","20"); // maps.put("sex","male"); // jedis.hmset("m1",maps); // List<String> hmget = jedis.hmget("m1", "name", "age", "sex"); // System.out.println(hmget); Map<String, String> m1 = jedis.hgetAll("m1"); for(Map.Entry map1 : m1.entrySet()){ System.out.println(map1.getKey()+"\t"+map1.getValue()); } jedis.hdel("m1","name"); Long m11 = jedis.hlen("m1"); System.out.println(m11); 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 listTest(){ //lpush/rpush/lrange/llen/lpop/rpop jedis.lpush("list1","1","2","3","4"); jedis.rpush("list1","5","6","7","8"); List<String> list1 = jedis.lrange("list1", 0, -1); System.out.println(list1); 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 setTest(){ //sadd/smembers/sismember/scard/srem // jedis.sadd("set1","1","4","5","4"); // jedis.sadd("set1","1","1","6","6"); // Set<String> set1 = jedis.smembers("set1"); // System.out.println(set1); System.out.println(jedis.sismember("set1","2")); System.out.println(jedis.sismember("set1","1")); System.out.println(jedis.scard("set1")); jedis.srem("set1","1"); System.out.println(jedis.sismember("set1","1")); }
-
小结
-
Jedis中实现Set的操作
-
知识点22:Jedis:Zset操作
-
目标:Jedis中实现Zset的操作
-
实施
zadd/zrange/zrevrange/zcard/zrem
@Test public void zsetTest(){ //zadd/zrange/zrevrange/zcard/zrem // jedis.zadd("zset1",20,"yuwen"); // jedis.zadd("zset1",99,"yingyu"); // jedis.zadd("zset1",30,"shengwu"); // jedis.zadd("zset1",55,"wuli"); Set<String> zset1 = jedis.zrange("zset1", 0, -1); // Set<Tuple> zset1 = jedis.zrevrangeWithScores("zset1", 0, -1); // System.out.println(zset1); System.out.println(jedis.zcard("zset1")); jedis.zrem("zset1","shengwu"); System.out.println(jedis.zrevrangeWithScores("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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。