Redis学习笔记整理(黑马程序员视频课程)
目录
Redis简介
NoSQL
Redis
Redis的应用
Redis 的数据存储类型介绍
String
string类型数据的操作
hash
hash类型数据的操作
list
list类型数据的操作
set
set类型数据的操作
sorted_set
sorted_set类型数据的操作
key通用操作
key特征
key基本操作
key扩展操作(时效性控制)
key扩展操作(查询模式)
key其他操作
数据库通用操作
db相关操作
Jedis简介
客户端连接redis
基于连接池获取连接
Redis简介
NoSQL
NoSQL:即Not-Nnly SQL(泛指菲关系型数据库),作为关系型数据库的补充。
作用:应对基于海量用户和海量数据前提下的数据处理问题。
特征:
可扩容,可伸缩
大数据量下高性能
灵活的数据模型
高可用
常见的NoSQL数据库有:
- Redis
- memcache
- HBase
- MongoDB
Redis
概念:Redis(REmote DIctionary Service)是用c语言开发的一个开源的高性能键值对(key-value)数据库。
特征:
1. 数据间没有必然的关联关系
2. 内部采用单线程机制进行工作
3. 高性能。官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s。
4. 多数据类型支持:
- 字符串类型 String
- 列表类型 List(LinkedList)
- 散列类型 hash(HashMap)
- 集合类型 set(HashSet)
- 有序集合类型 sorted_set(TreeSet)
5. 持久化支持。可以进行数据灾难恢复
Redis的应用
为热点数据加速查询(主要场景),如热点商品,热点新闻,热点资讯,推广类等高访问量信息等
任务队列,如秒杀,抢购、购票排队等
即时信息查询,如各种排行榜,各类网站访问统计,公交到站信息、在线人数信息等
时效性信息控制,如验证码控制,投票控制等
分布式数据共享,如分布式集群架构中的session分离
消息队列
分布式锁
Redis 的数据存储类型介绍
redis自身是一个Map,其中所有的数据都是采用key:value的形式存储。
数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串。
String
存储单个数据,是最简单的数据存储类型,也是最常用的数据存储类型,一个存储空间保存一个数据。
存储内容通常是字符串。如果字符串以整数的形式展示,可以作为数字操作使用。
string类型数据的操作
基本操作:
操作命令 | 命令功能 | 例子 |
set key value | 添加或修改数据 | set k1 v1 |
get key | 获取数据 | get k1 |
del key | 删除数据 | del k1 |
mset key1 value1 key2 value2... | 添加或修改多个数据 |
mset k1 v1 k2 v2... |
mget key1key2... | 获取多个数据 | mget k1 k2... |
strlen key | 获取数据字符的个数 | strlen k1 |
append key value | 追加信息到原始信息后部(如果原始信息存在就追加,否则新建) | append k1 v2 |
扩展操作:
操作命令 | 命令功能 |
incr key incrby key increment incrbyfloat key increment |
设置数值数据增加指定范围的值 |
decr key decrby key increment |
设置数值数据减少指定范围的值 |
- string在redis内部存储默认就是一个字符串,当遇到增减类操作incr、decr时会转成数值型进行计算。
- redis所有操作都是原子性的,采用单线程处理所有业务,命令是一个个执行的,一次无需考虑并发带来的数据影响。
- 注意:按数值进行操作的数据,如果原始数据不能转成数值,或超过了redis数值上限的范围,将报错。
redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作:
操作命令 | 命令功能 |
setex key seconds value | 设置数据具有指定生命周期(秒为单位) |
psetex key milliseconds value | 设置数据具有指定生命周期(毫秒为单位) |
key的设置约定:
hash
结构如图,一个key指向一个hash,hash里也是以键值对方式存储数据,即一个存储空间保存多个键值对数据;
底层是使用哈希表结构实现数据存储。
hash类型数据的操作
基本操作:
操作命令 | 命令功能 |
hset key field value | 添加或修改数据 |
hget key field hgetall key |
获取数据 |
hdel key field1 [field2] | 删除数据 |
hlen key | 获取hash内数据的条数 |
扩展操作:
操作命令 | 命令功能 |
hkeys key hvals key |
获取哈希表中所有的字段名或字段值 |
hincrby key field increment hincrbyfloat key field increment |
设置指定字段的数值数据增加指定范围的值 |
hsetnx key field value |
用于为哈希表中不存在的的字段赋值。 如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。 如果字段已经存在于哈希表中,操作无效。 如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令 |
注意事项:
- hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
- hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但是hash设计初衷不是为了存储大量对象而设计的,切记不可以滥用,更不可以将hash作为对象列表使用
- hgetall操作可以获取全部属性,但是如果内部fiel 过多,遍历整体数据效率就会很低,有可能成为数据访问的瓶颈
list
有序;
可以存储多个数据并对数据进入存储空间的顺序进行区分;
可以保存多个数据,底层使用双向链表存储结构实现;
list类型数据的操作
基本操作:
操作命令 | 命令功能 |
lpush key value1 [value2] ... rpush key value1 [value2] ... |
从链表左边插入数据 从链表右边插入数据 |
lrange key start stop |
获取列表指定范围内的元素,0 表示列表的第一个元素,-1表示最后一个元素 |
lindex key index | 通过索引获取列表中的元素 |
llen key | 获取列表长度 |
lpop key rpop key |
移出并获取列表的左边第一个元素; 移出并获取列表的右边第一个元素; |
扩展操作:
操作命令 | 命令功能 |
blpop key1 [key2] timeout |
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
brpop key1 [key2] timeout | 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
lrem key count value |
移除列表中与参数 VALUE 相等的元素。 COUNT 的值可以是以下几种:
|
注意事项:
- list中保存的数据都是string类型的,数据总容量是有限的,最多2的32次方-1个元素
- list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈
- 获取全部数据操作结束索引设置为-1
- list可以对数据进行分页操作,通常第一页的信息来自于list,第二页及更多信息通过数据库的形式加载
set
可以存储大量数据,在查询方面提供更高的效率;
与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的(hashSet)。
set类型数据的操作
基本操作:
操作命令 | 命令功能 |
sadd key menber1 [menber2] | 向集合添加一个或多个成员 |
smenbers key | 返回集合中的所有成员 |
srem key menber1 [menber2] | 移除集合中一个或多个成员 |
scard key | 获取集合的成员数 |
sismenber key menber | 判断 member 元素是否是集合 key 的成员 |
扩展操作:
操作命令 | 命令功能 |
srandmenber key [count] | 返回集合中一个或多个随机数 |
spop key | 移除并返回集合中的一个随机元素 |
Tip: redis 应用于随机推荐类信息检索,例如热点歌单推荐、热点新闻推荐、热卖旅游路线、应用APP推荐等。
操作命令 | 命令功能 |
sinter key1 [key2] | 求两个集合的交集 |
sunion key1 [key2] | 求两个集合的并集 |
sdiff key1 [key2] | 求两个集合的差集 |
sinterstore destination key1 [key2] | 返回给定所有集合的交集并存储在 destination 中 |
sunionstore destination key1 [key2] | 返回给定所有集合的并集并存储在 destination 中 |
sdiffstore destination key1 [key2] | 返回给定所有集合的差集并存储在 destination 中 |
smove source destination member | 将 member 元素从 source 集合移动到 destination 集合 |
注意事项:
- set类型不允许数据重复,若存入重复数据,会返回integer(0),报错信息
- set虽然与hash存储结构相同,但是无法开启hash中存储值的空间
应用场景:
- 利用set集合的数据去重的特征,记录各种访问数据
- 建立string类型数据,利用incr统计访问量...
Tip:redis应用于同类型数据的快速去重。
sorted_set
数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式;
相当于在set的存储结构基础上添加了可排序字段;
sorted_set类型数据的操作
基本操作:
操作命令 | 命令功能 |
zadd key score1 member [score2 menber2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
zrang key start stop [WITHSCORES] | 通过索引区间返回有序集合指定区间内的成员 |
zrevrang key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到低 |
zrem key member [menber...] | 移除有序集合中的一个或多个成员 |
zrangebyscore key min max [WITHSCORES] [LIMIT] | 通过分数返回有序集合指定区间内的成员 |
zrevrangebyscore key max min [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到低 |
zremrangebyrank key start stop | 移除有序集合中给定的排名区间的所有成员 |
zremrangebyscore key min max | 移除有序集合中给定的分数区间的所有成员 |
zcard key | 获取有序集合的成员数 |
zcount key min max | 计算在有序集合中指定区间分数的成员数 |
zinterstore destination numkeys key [key ...] | 计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination |
zunionstore destination numkeys key [key...] | 计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination |
注意:
- min与max用于限定搜索查询的条件
- start与stop用于限定查询范围,作用于索引,表示开始和结束索引
- offset于count用于限定查询范围,作用于查询结果,表示开始位置和数据总量
扩展操作:
操作命令 | 命令功能 |
zrank key member | 返回有序集合中指定成员的索引 |
zrevrank key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
zscore key member | 返回有序集中,成员的分数值 |
zincrby key increment member | 有序集合中对指定成员的分数加上增量 increment |
注意事项:
- score保存的数据存储空间是64位
- score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时要慎重
- sorted_set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将会被反复覆盖,保留最后一次修改的结果
key通用操作
key特征
key是一个字符串,通过key获取redis中保存的数据
key基本操作
操作命令 | 命令功能 |
del key | 删除指定key |
exists key | 获取key是否存在,若 key 存在返回 1 ,否则返回 0 |
type key | 获取key的类型 |
key扩展操作(时效性控制)
操作命令 | 命令功能 |
expire key seconds | 为给定 key 设置过期时间,以秒计。 |
pexpire key milliseconds | 设置 key 的过期时间以毫秒计。 |
expireat key timestamp | EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 |
pexpireat key milliseconds-timestamp | 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 |
ttl key | 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 |
pttl key | 以毫秒为单位返回 key 的剩余的过期时间。 |
persist key | 移除 key 的过期时间,key 将持久保持。 |
key扩展操作(查询模式)
操作命令 | 命令功能 |
keys pattern | 查找所有符合给定模式( pattern)的 key 。 |
key其他操作
操作命令 | 命令功能 |
rename key newkey | 重命名一个key。当 OLD_KEY_NAME 和 NEW_KEY_NAME 相同,或者 OLD_KEY_NAME 不存在时,返回一个错误。 当 NEW_KEY_NAME 已经存在时, RENAME 命令将覆盖旧值。 |
renamenx key newkey | 仅当 newkey 不存在时,将 key 改名为 newkey 。 |
sort | 对所有key排序() |
help @generic | 其他key通用操作 |
数据库通用操作
在redis中,key是由程序员定义的,伴随着操作数据量的增加,会出现大量数据以及对应的key,数据不区分种类,类别混杂在一起,极容易出现重复或冲突
解决办法:
- redis为每个服务提供有16个数据库,编号从0到15
- 每个数据库之间的数据相互独立
db相关操作
操作命令 | 命令功能 |
select index | 切换数据库 |
quit | 退出 |
ping | 测试数据库连通性 |
echo message | 打印信息 |
move key db | 移动数据到某一个数据库 |
dbsize flushdb flushall |
数据清除 |
Jedis简介
客户端连接redis
- 连接redis
Jedis jedis = new Jedis("localhost",6379);
- 操作redis
jedis.set("name","Ben");
jedis.get("name");
- 关闭redis连接
jedis.close();
基于连接池获取连接
JedisPool:Jedis提供的连接池技术
poolConfig:连接池配置对象
host:redis服务地址
port:redis服务端口号
public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, final int port) {this(poolConfig, host, port, Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE, null);}
public class JedisUtils {public static Jedis getJedis() {JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(30);//最大连接数config.setMaxIdle(10);//活动连接数JedisPool jp = new JedisPool(config,"127.0.0.2",6379);return jp.getResource();}public static void main(String[] args) {Jedis jedis = JedisUtils.getJedis();jedis.set("name","hello");String name = jedis.get("name");System.out.println(name);//3,。关闭连接jedis.close();}
}
Redis学习笔记整理(黑马程序员视频课程)相关推荐
- jQuery学习笔记【黑马程序员】
文章目录 前言 JQury学习 1.引入JQury 2.jqury简介 3.jQuery入口函数 4.dom对象与jQuery对象 4.1.dom对象 4.2.jQuery对象 4.3.jQuery对 ...
- 学习笔记:黑马程序员C++从0到1(3~4)
黑马程序员C++从0到1入门编程 3 运算符 3.1 算术运算符 3.2 赋值运算符 3.3 比较运算符 3.4 逻辑运算符 4 程序流程结构 4.1 选择结构 4.1.1 If 语句 4.1.1.1 ...
- JavaScript学习笔记--【黑马程序员】
目录 一.编程语言 1.1 编程 1.2 计算机语言 1.3 编程语言 1.4 翻译器 1.5 编程语言和标记语言区别 总结 二.计算机基础 2.1 计算机组成 2.2.数据存储 2.3 数据存储单位 ...
- 《C语言基础学习笔记》—— 黑马程序员 <Part1-4>
<C语言基础学习笔记 Part1-4> Part 1 基础介绍 1. 第一个C语言程序:HelloWorld 1.1 编写C语言代码:hello.c 1.2代码分析 1)include 头 ...
- 软测学习笔记(黑马程序员)
软件测试定义:使用技术手段验证软件是否满足使用需求. 7种测试分类的区别: 测试按阶段划分:1.单元测试(针对源代码测试)2.集成测试(针对接口测试)3.系统测试(针对功能非功能进行测试)4.验收测试 ...
- Maven学习笔记(黑马程序员)
一.Maven简介 maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型POM(Project Object Modle) maven的作用: 1.项目构建:提供标准 ...
- ZooKeeper官方文档学习笔记03-程序员指南03
我的每一篇这种正经文章,都是我努力克制玩心的成果,我可太难了,和自己做斗争. ZooKeeper官方文档学习笔记04-程序员指南03 绑定 Java绑定 客户端配置参数 C绑定 陷阱: 常见问题及故障 ...
- 2016最新整理黑马程序员JavaEE第28期 基础班就业班
2016最新整理黑马程序员JavaEE第28期 基础班就业班 http://blog.sina.com.cn/s/blog_88d972910102wti3.html
- 黑马程序员的课程不如兄弟连兄弟会好
[黑马程序员的课程不如兄弟连兄弟会好 兄弟连兄弟会it开发培训 www.itxdh.net 企鹅群:499956522 高端人才培养就到[兄弟连兄弟会it开发培训]纯免费的高端IT人才培养] 职场中的 ...
- 哔哩哔哩黑马程序员C++课程个人学习笔记
写在前面:此博文仅作为个人c++学习笔记,或有错误不建议参考!!! 视频链接:黑马程序员c++教程从0到1 目录 一.第一部分c++基础 1.1 c++初识 1.1.1 hello world 1.1 ...
最新文章
- php仿攻击,PHP写的仿DDOS攻击程序代码
- 一个跨国银行的敏捷转型案例要点之全员培训
- Qt Creator查找和更换
- 国内知名互联网公司的开源项目
- serverless搭建html,基于ServerLess的极简网页计数器:源码分析与实践
- ubuntu apache配置负载均衡篇(二)
- java反射的使用概览
- Oracle 11g R2 ADG 运维
- 上手深度学习之前,我们先聊聊“数学”
- 【Flink】flink-1.12 通过 -t 指定模式后无法指定yarn参数
- 云端点保护解决方案行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- jenkins ssh远程执行命令 碰到的2个坑
- 大数据可视化陈为智慧树_知到智慧树大数据可视化网课答案
- HTML5 案例学习笔记
- Hadoop性能调优
- I 爆炸的符卡洋洋洒洒(牛客)01背包
- 拼多多上市了!社交电商的力量不容小觑!
- Linux下对TF卡进行分区
- 论文投稿指南——中文核心期刊推荐(原子能技术)
- 朱松纯访谈录:初探计算机视觉的三个源头人工智能