redis的三种特殊的数据类型
redis内含五种基本的数据类型
字符串(strings)
散列(hashes)
列表(lists)
集合(sets)
有序集合(sorted sets)
除了这五种基本的数据类型以外还为我们提供了一些特殊的数据类型
bitmaps
hyperloglogs
地理空间(geospatial)
这些数据类型在日常生活中可以极大地提高便利性和系统性能。
bitmaps
bitmaps是redis为我们提供的一种位运算数据类型,内部只存在0和1两种数据,使用场景:
- 在线/非在线人数统计
- 活跃用户统计
- 打卡情况统计
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> clear
127.0.0.1:6379> setbit date 1 1
(integer) 0
127.0.0.1:6379> setbit date 2 1
(integer) 0
127.0.0.1:6379> setbit date 3 1
(integer) 0
127.0.0.1:6379> setbit date 4 1
(integer) 0
127.0.0.1:6379> setbit date 5 1
(integer) 0
127.0.0.1:6379> setbit date 6 0
(integer) 0
127.0.0.1:6379> setbit date 7 0
(integer) 0
127.0.0.1:6379> getbit date 5
(integer) 1
127.0.0.1:6379> getbit date 7
(integer) 0
127.0.0.1:6379> bitcount date
(integer) 5
上面这一段可以用来统计一周的打卡情况:
- setbit 向bitmaps中添加值
- getbit 向bitmaps中获取值
- bitcount 获取bitmaps中value为1的值的个数
hyperloglogs
hyperloglogs是redis为我们提供的一种计算基数的数据类型,相比于set可以节省更多内存,但是有0.81%的误差率,在允许少量误差的时候可以考虑使用,使用场景:
- 文章/博客观看人数统计
- 计数器
- 共同好友数量
127.0.0.1:6379> pfadd xiaoming a b c d e
(integer) 1
127.0.0.1:6379> pfadd zhangsan d e f g
(integer) 1
127.0.0.1:6379> pfcount xiaoming
(integer) 5
127.0.0.1:6379> pfcount zhangsan
(integer) 4
127.0.0.1:6379> pfmerge common xiaoming zhangsan
OK
127.0.0.1:6379> pfcount common
(integer) 7
上面这一段可以用来统计共同好友情况:
- pfadd 向hyperloglogs中添加值
- pfcount 查看hyperloglogs中值的数量
- pfmerge 合并两个hyperloglogs数据类型,获取基数
geospatial
geospatial是redis为我们提供的一种基于地理空间的数据类型,使用场景:
- 查看附近的人
- 查看两点间的直线距离
GEOADD:添加地址信息
GEODIST:计算两点之间直线距离
GEOHASH:查看两点hash值,两个值越相近则距离越近
GEOPOS:查看两点的经纬度信息
GEORADIUS:查看距离中心坐标一定半径内的key值
GEORADIUSBYMEMBER:查看指定key为中心一定半径内的key值
GEOADD
127.0.0.1:6379> geoadd city 116.397128 39.916527 beijing
(integer) 1
127.0.0.1:6379> geoadd city 121.48941 31.40527 shanghai
(integer) 1
127.0.0.1:6379> geoadd city 113.88308 22.55329 shenzhen
(integer) 1
127.0.0.1:6379> geoadd city 120.21201 30.2084 hangzhou
(integer) 1
--------------------------------------------------------------------
GEODIST
127.0.0.1:6379> geodist city beijing shanghai
"1052105.5643"
--------------------------------------------------------------------
GEOHASH
127.0.0.1:6379> geohash city beijing shanghai
1) "wx4g0dtf9e0"
2) "wtw6st1uuq0"
--------------------------------------------------------------------
GEOPOS
127.0.0.1:6379> geopos city beijing shanghai
1) 1) "116.39712899923324585"
2) "39.91652647362980844"
2) 1) "121.48941010236740112"
2) "31.40526993848380499"
--------------------------------------------------------------------
GEORADIUS
127.0.0.1:6379> georadius city 115 40 500 km
1) "beijing"
127.0.0.1:6379> georadius city 115 40 1500 km
1) "hangzhou"
2) "shanghai"
3) "beijing"
--------------------------------------------------------------------
GEORADIUSBYMEMBER
127.0.0.1:6379> georadiusbymember city shanghai 1000 km
1) "hangzhou"
2) "shanghai"
为什么使用redis会增加系统性能
因为Redis的瓶颈不是cpu的运行速度,而往往是网络带宽和机器的内存大小。再说了,单线程切换开销小,容易实现既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
再加上其巧妙地数据结构,以其nosql(not only sql)的优势,自然速度就要比普通的sql要快上许多。