一、基本概念
1、定义
Redis(Remote Dictionary Server ),即远程字典服务。是一个开源的使用ANSI
C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API;
redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
2、特性
(1)速度快,基于键值对的数据结构服务器;
(2)丰富的功能:键过期、发布订阅、支持lua脚本、事务功能、流水线功能(批量命令);
(3)简单稳定,客户端语言多;
(4)持久化,主从复制,高可用和分布式;
3、典型的使用场景
(1)缓存:加快数据的访问速度 ;
(2)排行榜系统:例如按照热度排名;
(3)计数器应用:浏览数等 ;
(4)社交网络:赞踩、粉丝、共同好友、推送、下拉刷新 ;
(5)消息队列系统;
4、相关全局命令
5、基础知识
(1)redis默认有16个数据库,默认使用的第0个; 默认使用DB 0 ,可以使用select n切换到DB n,dbsize可以查看当前数据库的大小,与key数量相关。
(2)Redis是单线程的,Redis是基于内存操作的。所以Redis的性能瓶颈不是CPU,而是机器内存和网络带宽。
(3)数据类型:String,Hash,Set,List,Zset
Redis为什么单线程还这么快?
核心:Redis是将所有的数据放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作!),对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的,在内存存储数据情况下,单线程就是最佳的方案。
二、基本数据类型及基本操作
1、String
(1)字符串类型的值实际可以是字符串、数字、二进制,但是最大值不能超过512M。
(2)常用命令:
(3)应用场景: 计数器,粉丝数,对象存储缓存
2、List
(1)定义:Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边);
首先我们列表,可以经过规则定义将其变为队列、栈、双端队列等。正如图Redis中List是可以进行双端操作的,所以命令也就分为了LXXX和RLLL两类。
(2)常用命令:
(3)应用场景:消息排队!消息队列(Lpush Rpop),栈(Lpush Lpop)
3、Hash
(1)Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
(2)常用命令:
(3)应用场景:Hash变更的数据user name age,尤其是用户信息之类的,经常变动的信息!Hash更适合于对象的存储,Sring更加适合字符串存储!
4、Set
(1)定义:Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
(2)常用命令:
5、Zset
(1)定义:不同的是每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大的排序。
score相同:按字典顺序排序
有序集合的成员是唯一的,但分数(score)却可以重复。
(2)常用命令:
(3)应用场景:
- set排序 存储班级成绩表 工资表排序!
- 普通消息,1.重要消息 2.带权重进行判断
- 排行榜应用实现,取Top N测试
三、三大特殊数据类型
1、geospatial
(1)定义:把某个具体的位置信息(经度,纬度,名称)添加到指定的key中,数据将会用一个sorted set存储,以便稍后能使用 GEORADIUS和 GEORADIUSBYMEMBER命令来根据半径来查询位置信息。
(2)常用命令:
- GEODIST 返回一个key中指定两个位置之间的距离 格式:GEODIST key member1 member2 [unit]
- unit可以指定长度单位:m,km,ft等 默认为m
- GEOHASH 返回一个或多个位置元素的 Geohash 表示,Geohash是一种经纬度散列算法,具体请百度。
- 格式: GEOHASH key member [member ...]
- GEOPOS 返回一个或多个位置的经纬度信息,由于采用了geohash算法,返回的经纬度和添加时的数据可能会有细小误差
- 格式: GEOPOS key member [member ...]
- GEORADIUS 以给定位置为中心,半径不超过给定半径的附近所有位置
- 格式 GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD]
[WITHDIST] [WITHHASH] [COUNT count]
- GEORADIUSBYMEMBER 和GEORADIUS相似,只是中心点不是指定经纬度,而是指定已添加的某个位置作为中心
- 格式: GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD]
[WITHDIST] [WITHHASH] [COUNT count]
(3)应用场景:
- 朋友的定位,附近的人,打车距离计算。
- 两地之间的距离,方圆几里的人
- 可以查询一些测试数据
2、hyperloglog
(1)定义:用来做基数统计的算法。在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
(2)常用命令:
- PFADD key element [element ...]
- 添加指定元素到 HyperLogLog 中。
- PFCOUNT key [key ...]
- 返回给定 HyperLogLog 的基数估算值。
- PFMERGE destkey sourcekey [sourcekey ...]
- 将多个 HyperLogLog 合并为一个 HyperLogLog
(3)应用场景: 可以容忍一定的误差率的情况下,计算独立总数,不需要获取单条数据;
3、bitmap
(1)定义:位存储,bitmap 位图,也是一种数据结构!都是操作二进制位来进行记录,都只有 0 1两种状态;
(2)常用命令:
- setbit设置某一位上的值
- SETBIT key offset value (offset位偏移量,从0开始)
- getbit 获取某一位上的值
- 语法:GETBIT key offset
(3)应用场景:
- 网站用户签到的天数统计
- 按天统计网站活跃用户
- 用户在线状态、在线人数统计