全称为远程字典服务。
Redis——基础篇(包含redis在云服务上的docker化安装和连接以及常用命令)_连接docker中的redis_北岭山脚鼠鼠的博客-CSDN博客
1.内存存储、持久化,内存中是断电即失,因此持久化很重要(rdb,aof)
2.效率高,可以用于高速缓存。
3.发布订阅系统
4.地图信息分析
5.计时器,计数器(浏览量)
6. ...
朋友的定位,附近的人,打车距离计算
Redis的geo可以推算地理位置的信息,两地之间的距离,方圆几里之内的人。
六个命令
城市经纬度查询-国内城市经度纬度在线查询工具
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 用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回null
语法格式如下
GEOPOS key member [member ...]
#查询单条数据
geopos china:city beijing
#查询多条数据
geopos china:city beijing shanghai
geodist 用于返回两个给定位置之间的距离。
geodist 语法格式如下:
GEODIST key member1 member2 [m|km|ft|mi]
member1 member2 为两个地理位置。
最后一个距离单位参数说明:
geodist china:city beijing shanghai
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]
georadius china:city 110 30 2000 km WITHDIST
georadiusbymember china:city shanghai 2000 km withdist
Redis GEO 使用 geohash 来保存地理位置的坐标。
geohash 用于获取一个或多个位置元素的 geohash 值。
geohash 语法格式如下:
GEOHASH key member [member ...]
geo底层用的是zset实现
查看
zrange china:city 0 -1
删除
zrange china:city guangzhou
什么是基数?不重复的元素的个数
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 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
Redis Pfadd 命令将所有元素参数添加到 HyperLogLog 数据结构中。
PFADD key element [element ...]
pfadd mykey 1 2 3 4 4
Redis Pfcount 命令返回给定 HyperLogLog 的基数估算值。
PFCOUNT key [key ...]
pfcount mykey
Redis PFMERGE 命令将多个 HyperLogLog 合并为一个 HyperLogLog ,合并后的 HyperLogLog 的基数估算值是通过对所有 给定 HyperLogLog 进行并集计算得出的。
PFMERGE destkey sourcekey [sourcekey ...]
Redis Setbit 命令用于对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
Setbit KEY_NAME OFFSET
redis> SETBIT bit 10086 1
(integer) 0
redis> GETBIT bit 10086
(integer) 1
redis> GETBIT bit 100 # bit 默认被初始化为 0
(integer) 0
Redis Getbit 命令用于对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
GETBIT KEY_NAME OFFSET
redis> GETBIT bit 10086
(integer) 0
统计一个key里面对应的1有多少
bitcount bit
Redis事务本质:一组命令的集合,一个事务的所有命令都会被序列化,执行时,会按照顺序执行
一次性,顺序性,排他性。
Redis单条命令是保证原子性的,但是事务不保证原子性。
Redis不存在隔离级别的概念。
一个事务从开始到执行会经历以下三个阶段:
代码问题、命令有错
所有命令都不会执行
字符串无法加1,所以失败了。但是其他的正常执行了。
无论任何操作都加锁,影响性能。
认为什么时候都不会出问题,所以不会上锁。
更新数据的时候去判断一下,在此期间是否有人修改过这个锁。
获取version,更新时比较version
测试多线程修改值时,使用watch可以当做redis的乐观锁。
一个进程在watch之后进了事物,还没执行时,另一个进程在执行时就会修改失败。
想要成功可以直接unwatch解锁,然后再次watch监视.