Redis介绍
数据结构服务器,redis是一个key-value 存储系统。非关系数据库。
Redis经常用于缓存、秒杀、分布式锁等场景使用
非关系型数据库的分类
1、面向高性能并发读写的key-value数据库:
key-value
数据库的主要特点是具有极高的并发读写性能
Key-value
数据库是一种以键值对存储数据的一种数据库,类似Java
中的map
。可以将整个数据库理解为一个大的map
,每个键都会对应一个唯一的值。
主流代表为 Redis, Amazon DynamoDB, Memcached,Microsoft Azure Cosmos DB和Hazelcast
2、面向海量数据访问的面向文档数据库:
这类数据库的主要特点是在海量的数据中可以快速的查询数据
文档存储通常使用内部表示法,可以直接在应用程序中处理,主要是JSON
。JSON
文档也可以作为纯文本存储在键值存储或关系数据库系统中。
主流代表为MongoDB,Amazon DynamoDB,Couchbase,
Microsoft Azure Cosmos DB和CouchDB
3、面向搜索数据内容的搜索引擎:
搜索引擎是专门用于搜索数据内容的NoSQL数据库管理系统。
主要是用于对海量数据进行近实时的处理和分析处理,可用于机器学习和数据挖掘
主流代表为Elasticsearch,Splunk,Solr,MarkLogic和Sphinx
CAP: Consistency、Availability、Partition tolerance ,**一个分布式系统不可能同时满足C(一致性)、A(可用性)、P(分区容错性)**三个基本需求,并且最多只能满足其中的两项。
当今十大主流的关系型数据库
Oracle,Microsoft SQL Server,MySQL,PostgreSQL,DB2,
Microsoft Access, SQLite,Teradata,MariaDB(MySQL的一个分支),SAP
1、redis的安装和启动
1.1 redis的安装
1.2 redis的启动
windows环境下进入安装的redis的安装包中,输入以下命令
redis-server redis.windows.conf
设置服务命令,
redis-server --service-install redis.windows-service.conf --loglevel verbose
卸载服务:redis-server --service-uninstall
开启服务:redis-server --service-start
停止服务:redis-server --service-stop
1.3 测试连接
redis-cli.exe -h 127.0.0.1 -p 6379
redis-cli -a "xidian@123"
#需要密码
redis-cli -h host -p port -a password
#设置密码
config set requirepass xidian@123
1.4 查看所有key
KEYS pattern
keys *
2、Redis的数据结构及使⽤场景
big key问题: key对应的值很大加big key问题
Redis的数据结构有:
-
-
string 字符串:可以⽤来做最简单的数据缓存,可以缓存某个简单的字符串,也可以缓存某个json格式的字符串,Redis分布式锁的实现就利⽤了这种数据结构,还包括可以实现计数器、Session共享、分布式ID
字符串常用操作 SET key value //存入字符串键值对 MSET key value [key value ...] //批量存储字符串键值对 SETNX key value //存入一个不存在的字符串键值对 GET key //获取一个字符串键值 MGET key [key ...] //批量获取字符串键值 DEL key [key ...] //删除一个键 EXPIRE key seconds //设置一个键的过期时间(秒) 原子加减 INCR key //将key中储存的数字值加1 DECR key //将key中储存的数字值减1 INCRBY key increment //将key所储存的值加上increment DECRBY key decrement //将key所储存的值减去decrement
-
单值缓存:SET key value GET key
-
对象缓存: 可以使用MSET 命令批量存储字符串键值对
- SET user: {userId} value(json格式数据) 可以通过Redis缓存数据格式
- MSET user:1:name zhuge user:1:balance 1888
MGET user:1:name user:1:balance
-
-
-
-
hash 哈希表:可以⽤来存储⼀些key-value对,更适合⽤来存储对象 ,实用场景,电商购物车
(以用户id为key、商品id为field、商品数量为value)
Hash常用操作 HSET key field value //存储一个哈希表key的键值 HSETNX key field value //存储一个不存在的哈希表key的键值 HMSET key field value [field value ...] //在一个哈希表key中存储多个键值对 HGET key field //获取哈希表key对应的field键值 HMGET key field [field ...] //批量获取哈希表key中多个field键值 HDEL key field [field ...] //删除哈希表key中的field键值 HLEN key //返回哈希表key中field的数量 HGETALL key //返回哈希表key中所有的键值 HINCRBY key field increment //为哈希表key中field键的值加上增量increment
对象缓存
HMSET user {userId}:name zhuge {userId}:balance 1888
HMSET user 1:name zhuge 1:balance 1888HMSET user 2:name yangguo 2:balance 1600
HMGET user 1:name 1:balance
Hash数据结构和String数据结构的优缺点:
优点
1)同类数据归类整合储存,方便数据管理
2)相比string操作消耗内存与cpu更小
3)相比string储存更节省空间缺点
过期功能不能使用在field上,只能用在key上
Redis集群架构下不适合大规模使用
-
-
-
list 列表:Redis的列表通过命令的组合,可以实现做栈、队列、阻塞队列的数据结构,可以⽤来缓存类似微信公众号、微博等消息流数据
List常用操作 LPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最左边) RPUSH key value [value ...] //将一个或多个值value插入到key列表的表尾(最右边) LPOP key //移除并返回key列表的头元素 RPOP key //移除并返回key列表的尾元素 LRANGE key start stop //返回列表key中指定区间内的元素,区间以偏移量start和stop指定 BLPOP key [key ...] timeout //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待 BRPOP key [key ...] timeout //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待
常用数据结构 Stack(栈) = LPUSH + LPOP Queue(队列)= LPUSH + RPOP Blocking MQ(阻塞队列)= LPUSH + BRPOP
-
-
-
set 集合:和列表类似,也可以存储多个元素,但是不能重复,集合可以进⾏交集、并集、差集操作,从⽽可以实现类似,微信抽奖小程序,我和某⼈共同关注的⼈、朋友圈点赞等功能 。
Set常用操作 SADD key member [member ...] //往集合key中存入元素,元素存在则忽略, 若key不存在则新建 SREM key member [member ...] //从集合key中删除元素 SMEMBERS key //获取集合key中所有元素 SCARD key //获取集合key的元素个数 SISMEMBER key member //判断member元素是否存在于集合key中 SRANDMEMBER key [count] //从集合key中选出count个元素,元素不从key中删除 SPOP key [count] //从集合key中选出count个元素,元素从key中删除
Set运算操作 SINTER key [key ...] //交集运算 SINTERSTORE destination key [key ..] //将交集结果存入新集合destination中 SUNION key [key ..] //并集运算 SUNIONSTORE destination key [key ...] //将并集结果存入新集合destination中 SDIFF key [key ...] //差集运算 SDIFFSTORE destination key [key ...] //将差集结果存入新集合destination中
案例:可以完成微博一些 共同关注、我关注的人也关注他xx、我可能认识的人
微信微博点赞,收藏,标签
- 点赞 SADD like:{消息ID} {用户ID}
- 取消点赞 SREM like:{消息ID} {用户ID}
- 检查用户是否点过赞
SISMEMBER like:{消息ID} {用户ID} - 获取点赞的用户列表
SMEMBERS like:{消息ID} - 获取点赞用户数
SCARD like:{消息ID}
集合操作实现微博微信关注模型
- 诸葛老师关注的人:
zhugeSet-> {guojia, xushu} - 杨过老师关注的人:
yangguoSet–> {zhuge, baiqi, guojia, xushu} - 郭嘉老师关注的人:
guojiaSet-> {zhuge, yangguo, baiqi, xushu, xunyu) - 我和杨过老师共同关注:
SINTER zhugeSet yangguoSet–> {guojia, xushu} - 我关注的人也关注他(杨过老师):
SISMEMBER guojiaSet yangguo
SISMEMBER xushuSet yangguo - 我可能认识的人:
SDIFF yangguoSet zhugeSet->(zhuge, baiqi}
-
-
-
zset 有序集合:集合是⽆序的,有序集合可以设置顺序,可以⽤来实现排⾏榜功能
ZSet常用操作 ZADD key score member [[score member]…] //往有序集合key中加入带分值元素 ZREM key member [member …] //从有序集合key中删除元素 ZSCORE key member //返回有序集合key中元素member的分值 ZINCRBY key increment member //为有序集合key中元素member的分值加上increment ZCARD key //返回有序集合key中元素个数 ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素 ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素 Zset集合操作 ZUNIONSTORE destkey numkeys key [key ...] //并集计算 ZINTERSTORE destkey numkeys key [key …] //交集计算
-
redis使用了两种文件格式:全量数据和增量请求。
全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;
增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。