redis数据结构介绍
Redis-课堂笔记
一、简介
目标
- 了解NoSQL的概念
- 了解Redis是什么样的数据库
讲解
1. NoSQL:Not only SQL
- 数据库类型:
- 关系型数据库:以表的形式存储数据,以键和约束的形式维护数据关系,这样的数据库就是关系型数据库
- MySql,Oracle,SQLServer,DB2,Sybase等等
- 非关系型数据库(NoSQL):不以表的形式存储数据的数据库
- 关系型数据库:以表的形式存储数据,以键和约束的形式维护数据关系,这样的数据库就是关系型数据库
- 为什么有非关系型数据库?
-
关系型数据库:随着数据量的增加、用户的增加,出现了一些难以解决的问题:
- 高并发问题:瞬间有海量的请求同时操作数据库。比如:双11,12306春节抢票
- 高性能问题:瞬间从海量数据里,找到并操作某一条数据。比如:微博的数据量,亚马逊的数据
- 高扩展性问题:数据库集群环境里,要增加数据库节点,需要做数据迁移
- 非关系型数据库NoSQL:
- 易扩展
- 高性能
- 灵活的数据模型:不以表的形式存储
- 高可用
-
关系型数据库:随着数据量的增加、用户的增加,出现了一些难以解决的问题:
- 能否抛弃关系型数据库,全部使用非关系型数据库?不能
- 业务数据之间是有关系的,就需要维护数据之间的关系。
- 如果直接使用非关系型数据库,不能维护数据关系,只能自己写代码维护数据关系
- 如果使用关系型数据库,数据库就可以帮我们维护数据之间的关系。使用非关系型数据库作为补充,提升web应用的性能。Redis就是作为缓存使用的
2. Redis
- Redis数据库:是一个C语言编写的开源的高性能的数据库,是以key-value键值对的形式存储数据,数据是保存在了内存中,所以有极高的读写性能。官方数据:读110000次/s,写81000次/秒
- Redis的端口:6379 merz
小结
二、安装Redis
目标
- 能够操作windows的Redis:启动服务,打开客户端连接服务,关闭服务
- 安装Linux版的Redis
- 能够操作Linux版的Redis:启动服务,打开客户端连接服务,关闭服务
讲解
1. Windows版的
- 启动服务:双击
redis-server.exe
- 启动客户端:双击
redis-cli.exe
- 启动之后,会自动连接上本机的Redis数据库,可以直接通过redis命令操作
拓展:redis-cli如何连接远程的redis服务?
在cmd/powershell里,通过命令:
redis-cli.exe -h ip地址 -p 端口
2. Linux版的
- 启动服务:
./redis-server ./redis.conf
- 启动客户端:
./redis-cli
- 关闭服务:
./redis-cli shutdown
小结
三、数据类型
目标
- 能说出Redis的5种数据类型【面试题】
讲解
- Redis以键值对形式存储数据。
- Redis的key:
- 不要太长,不要超过1024个字节;否则会消耗内存,影响性能
- 不要太短;否则会降低可读性
- Redis的value:常用有5种数据类型(数据结构)
- string:字符串类型
- hash:哈希类型
- list:链表类型
- set:集合类型,无序不重复的数据集合
- zset:有序集合类型,有序不重复的数据集合
小结
四、Redis的数据操作【重点】
1. String【重点】
目标
- 掌握String类型的常用操作
讲解
说明
- string是redis最基本的类型,用的也是最多的,一个key对应一个value。
- 一个键最大能存储512MB.
应用场景
- 作为缓存:字符串最经典的使用场景,redis最为缓存层,Mysql作为储存层,绝大部分请求数据都是在redis中操作,由于redis具有支撑高并发特性,所以缓存通常能起到加速读写和降低 后端压力的作用。
- 计数器:比如视频播放次数,点赞次数。
常用命令
- 设置字符串:
set key value
- 获取字符串:
get key
- 删除字符串:
del key
- 存储字符串,并设置有效期:
setex key seconds value
2. hash
目标
- 掌握hash类型的常用操作
讲解
说明
- Redis中hash 是一个键值对集合,类似于Java里的HashMap。
- Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
应用场景
- 存储对象的数据
- 特别适合用于存储订单信息:以订单号为key,field为商品编号,value为商品数量
常用命令
小结
- 向hash里设置值:
hset key field value
- 如果要设置多个:
hmset key field1 value1 field2 value2 ......
- 如果要设置多个:
- 从hash里获取值:
hget key field
- 如果 获取多个:
hmget key field1 field2 ......
- 如果 获取多个:
- 从hash里删除数据:
hdel key field
3. list
目标
- 掌握list的常用操作
讲解
说明
- 链表类型(或 列表类型,list)可以存储一个
有序的字符串列表(链表)
,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。 - 列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。
应用场景
- 消息队列
- 排队机制
- 变更不频繁的排行榜(用list,比zset更节省内存)
常用命令
- 向列表里添加数据:
- 从左边添加:
lpush key v1 v2 v3...
- 从右边添加:
rpush key v1 v2 v3...
- 从左边添加:
- 从列表里弹出数据:(弹出后列表里就没有了)
- 从左边弹出:
lpop key
- 从右边弹出:
rpop key
- 从左边弹出:
4. set
目标
- 掌握set类型的常用操作
讲解
说明
-
Redis的Set是string类型的无序不重复的集合,Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的时间复杂度都是O(1)。集合中最大的成员数为 2的32次方 -1 (4294967295, 每个集合可存储40多亿个成员)。
-
Redis还提供了多个集合之间的交集、并集、差集的运算
应用场景
- 共同好友
- 共同兴趣
常用命令
小结
- 向集合里添加成员:
sadd key member1 member2 member3...
- 获取所有成员:
smembers key
- 随机取出一个成员:
spop key
5. zset
目标
- 掌握zset的常用操作
讲解
说明
-
Redis 有序集合也是string类型元素的不重复的集合
- 每个元素都会关联一个double类型的分数。有序集合的成员是唯一的,但分数(score)却可以重复。
- redis正是通过分数来为集合中的成员进行从小到大的排序。
-
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
应用场景
- 排行榜
常用命令
- 默认排序是从小到大的升序
- 如果要从大到小排序,使用命令:
zrevrange
小结
- 添加成员:
zadd key score1 member1 score2 member2...
- 删除成员:
zrem key member
- 按名次范围查询:
zrange key start stop withscores
五、Redis的其它操作
Redis的其它命令
目标
- 掌握redis的一些其它通用命令
分析
- redis的通用命令
- redis的多数据库特性
讲解
redis的通用命令
-
keys *
:查询所有的key-
keys myset?
:查询所有key为myset
+ 一个任意字符的
-
-
exists key
:判断是否有指定的key 若有返回1,否则返回0 -
expire key 秒数
:设置这个key在redis中的存活时间(setex key seconds value
) -
ttl key
:展示指定key的剩余时间- 如果值为 -1:永不过期
- 如果值为 -2:已过期或者不存在
-
del key
:删除指定key -
rename key 新key
:重命名key -
type key
:判断一个key的类型 -
ping
:测试连接是否连接
多数据库特性
-
redis默认是16个数据库, 编号是从0~15. 【默认是0号库】
-
常用的库操作有:
-
select index
:切换库 -
move key index
: 把key移动到几号库(index是库的编号) -
flushdb
:清空当前数据库 -
flushall
:清空当前实例下所有的数据库
-