概述
全称为远程字典服务。
Redis——基础篇(包含redis在云服务上的docker化安装和连接以及常用命令)_连接docker中的redis_北岭山脚鼠鼠的博客-CSDN博客
Redis能干什么?
1.内存存储、持久化,内存中是断电即失,因此持久化很重要(rdb,aof)
2.效率高,可以用于高速缓存。
3.发布订阅系统
4.地图信息分析
5.计时器,计数器(浏览量)
6. ...
三种特殊数据类型
geospatial地理位置
朋友的定位,附近的人,打车距离计算
Redis的geo可以推算地理位置的信息,两地之间的距离,方圆几里之内的人。
六个命令
- geoadd:添加地理位置的坐标。
- geopos:获取地理位置的坐标。
- geodist:计算两个位置之间的距离。
- georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
- georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
- geohash:返回一个或多个位置对象的 geohash 值。
geoadd
城市经纬度查询-国内城市经度纬度在线查询工具
geoadd 用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。
geoadd 语法格式如下:
GEOADD key longitude latitude member [longitude latitude member ...]
#添加单条数据
geoadd china:city 116 39 beijing
#添加多条数据
geoadd china:city 113.28 23.12 guangzhou 121.47 31.23 shanghai
geopos
geopos 用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回null
语法格式如下
GEOPOS key member [member ...]
#查询单条数据
geopos china:city beijing
#查询多条数据
geopos china:city beijing shanghai
geodist
geodist 用于返回两个给定位置之间的距离。
geodist 语法格式如下:
GEODIST key member1 member2 [m|km|ft|mi]
member1 member2 为两个地理位置。
最后一个距离单位参数说明:
- m :米,默认单位。
- km :千米。
- mi :英里。
- ft :英尺。
geodist china:city beijing shanghai
georadius、georadiusbymember
georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
georadiusbymember 和 georadius 命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember 的中心点是由给定的位置元素决定的, 而不是使用经度和纬度来决定中心点。
georadius 与 georadiusbymember 语法格式如下:
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
- m :米,默认单位。
- km :千米。
- mi :英里。
- ft :英尺。
- WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
- WITHCOORD: 将位置元素的经度和纬度也一并返回。
- WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
- COUNT 限定返回的记录数。
- ASC: 查找结果根据距离从近到远排序。
- DESC: 查找结果根据从远到近排序。
georadius china:city 110 30 2000 km WITHDIST
georadiusbymember china:city shanghai 2000 km withdist
geohash
Redis GEO 使用 geohash 来保存地理位置的坐标。
geohash 用于获取一个或多个位置元素的 geohash 值。
geohash 语法格式如下:
GEOHASH key member [member ...]
删除位置
geo底层用的是zset实现
查看
zrange china:city 0 -1
删除
zrange china:city guangzhou
Hyperloglog
什么是基数?不重复的元素的个数
A{1,3,5,7,8,7} =5
B{1,3,517,8} =5
redis Hyperloglog 基数统计的算法
应用场景:
网页的UV(一个人访问一个网站多次,但是还是算作一个人)
传统方式,set保存用户id.
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
pfadd
Redis Pfadd 命令将所有元素参数添加到 HyperLogLog 数据结构中。
PFADD key element [element ...]
pfadd mykey 1 2 3 4 4
pfcount
Redis Pfcount 命令返回给定 HyperLogLog 的基数估算值。
PFCOUNT key [key ...]
pfcount mykey
pfmerge
Redis PFMERGE 命令将多个 HyperLogLog 合并为一个 HyperLogLog ,合并后的 HyperLogLog 的基数估算值是通过对所有 给定 HyperLogLog 进行并集计算得出的。
PFMERGE destkey sourcekey [sourcekey ...]
Bitmaps位存储
setbit
Redis Setbit 命令用于对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
Setbit KEY_NAME OFFSET
redis> SETBIT bit 10086 1
(integer) 0redis> GETBIT bit 10086
(integer) 1redis> GETBIT bit 100 # bit 默认被初始化为 0
(integer) 0
Getbit
Redis Getbit 命令用于对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
GETBIT KEY_NAME OFFSET
redis> GETBIT bit 10086
(integer) 0
Bitcount
统计一个key里面对应的1有多少
bitcount bit
Redis事务本质:一组命令的集合,一个事务的所有命令都会被序列化,执行时,会按照顺序执行
一次性,顺序性,排他性。
Redis单条命令是保证原子性的,但是事务不保证原子性。
Redis不存在隔离级别的概念。
执行事务
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。(multi)
- 命令入队。(其他命令)
- 执行事务。(exec)
关闭事务
编译型异常
代码问题、命令有错
所有命令都不会执行
运行时异常
字符串无法加1,所以失败了。但是其他的正常执行了。
监控
悲观锁
无论任何操作都加锁,影响性能。
乐观锁
认为什么时候都不会出问题,所以不会上锁。
更新数据的时候去判断一下,在此期间是否有人修改过这个锁。
获取version,更新时比较version
redis的监视测试
正常监视
测试多线程修改值时,使用watch可以当做redis的乐观锁。
一个进程在watch之后进了事物,还没执行时,另一个进程在执行时就会修改失败。
想要成功可以直接unwatch解锁,然后再次watch监视.