Day24:内存式NoSQL数据库Redis
Posted 保护胖丁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day24:内存式NoSQL数据库Redis相关的知识,希望对你有一定的参考价值。
- 知识点01:目标
- 知识点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依赖
知识点01:目标
- NoSQL与RDBMS区别
- 技术层次区别
- 应用层次区别
- Redis的介绍
- 功能
- 应用场景
- 特点
- Redis的使用【重点】
- 命令行的使用方式:支持各种增删改查
- Jedis:Java操作Redis API
知识点02:NoSQL与RDBMS
-
目标:了解NoSQL的应用场景与RDBMS的区别
-
路径
- step1:RDBMS的特点
- step2:业务架构中的问题
- step3:NoSQL的特点
-
实施
-
RDBMS的特点:关系型数据库管理系统
- 工具:mysql、Oracle、SQL Server……
- 应用:业务性数据存储系统:事务和稳定性
- 特点:体现数据之间的关系,支持事务,保证业务完整性和稳定性,小数据量的性能也比较好
- 开发:SQL
-
业务架构中的问题
- 问题:以网站后台存储为例,当并发量很大,所有高并发全部直接请求MySQL,容易导致MySQL奔溃
-
- 需求:能实现高并发的数据库,接受高并发请求
-
NoSQL的特点:Not Only SQL:非关系型数据库
-
工具:Redis、HBASE、MongoDB……
-
应用:一般用于高并发高性能场景下的数据缓存或者数据库存储
-
特点:读写速度特别快,并发量非常高,相对而言不如RDBMS稳定,对事务性的支持不太友好
-
开发:每种NoSQL都有自己的命令语法
-
解决上面RDBMS的问题:实现读写分离
- 读请求:读请求不读取MySQL,读取Redis
- 写请求:写请求直接写入MySQL
-
-
小结
- RDBMS的特点是什么?
- 应用:业务存储问题
- 特点:事务、稳定性和安全性、小数据量的性能比较好
- NoSQL的特点是什么?
- 应用:高并发和高性能的问题
- 特点:数据量大的场景下读写速度快,并发量高
- RDBMS的特点是什么?
知识点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数据库
-
-
功能特点
- 功能:提供高性能高并发的数据存储
- 特点
- 基于C语言开发的系统,与硬件的交互性能更好
- 基于内存实现数据读写,读写性能更快
- 分布式的、扩展性和稳定性更好
- 支持事务、拥有各种丰富的数据结构
-
应用场景
- 缓存:用于实现高并发的数据缓存
- 数据库:用于实现高性能的数据读写
- 场景
- 数据库:永久性存储,高性能的读写结果存储大数据领域中
- 缓存:临时性存储,业务系统中作为缓存
- 消息中间件:消息队列MQ,一般不用
-
-
小结
- Redis的功能与应用场景是什么?
- 功能:提供高性能高并发分布式内存的存储
- 应用
- 缓存:高并发的读写
- 数据库:高性能的读写
- 特点:C语言、分布式、内存、支持事务、多种数据类型
- Redis的功能与应用场景是什么?
知识点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服务端
- 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
-
编译安装
#进入源码目录 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
-
-
启动
-
启动服务端
-
启动命令
/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集合
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
- Redis中的数据是什么结构?
知识点08:Redis的通用命令
-
目标:掌握Redis常用的通用命令
-
实施
-
keys:列举当前数据库中所有Key
- 语法:keys 通配符
- 语法: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
- 语法: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 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>
- 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> 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:将每个元素放到集合的左边,左序放入
- 语法: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 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:倒序查询
-
语法: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表示的是字节 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.
以上是关于Day24:内存式NoSQL数据库Redis的主要内容,如果未能解决你的问题,请参考以下文章