Redis五大数据类型
- String
- List
- Set
- Hash
- Zset
Redis官方介绍
- Redis是内存中的数据结构存储系统,可以作用数据库、缓存、消息中间MQ
- 支持多种数据类型
- String字符串
- hash散列
- list列表
- set 集合
- sorted sets有序集合
- bimemaps
- hyperloglog
- geospatial
- Redis内置了主从复制replication、LUAscripting脚本,LRU 驱动事件,transactions事务,和不同级别的磁盘持久化persistence
- 通过Redis哨兵Sentinel,和自动分区Cluster,提供高可用性high availability
Redis
-
redis-server & #后台启动 redis-server /etc/local/bin/redis.conf #指定文件启动 -p #指定端口启动
-
keys * 查询全部key
-
select 3 切换数据库3
-
dbsize 查看数据库大小
-
flushdb 清空当前库
-
flushall 清空所有数据
-
exists 判断某个key是否存在
-
move 移除key
-
expire 设置过期时间,可以用作单点登录
-
ttl 查看过期时间
-
type 查看key的类型
-
config set requirepass XXX 设置密码
- config set requirepass “” 取消密码
-
auth xxx 登录
String
-
append 追加value
- 追加不存在的key会set key
-
strlen 查看value长度
-
incr 自增1,可以用作增加浏览量increase
-
decr decrease 递减
-
incrby 能设置自增量的自增
-
getrange 截取范围,下标从0开始
-
setrange 修改范围的值
-
setex set wth expire 设置key时顺便设置生存时间
-
setnx ( set if not exist )参数不存在就设置,在分布式锁经常使用,如果存在就创建失败
-
mset 批量设置,空格间隔
-
mget
-
msetnx 原子性操作,批量设置
-
对象操作
-
127.0.0.1:6379> mset user:1:name lwh user:1:age 3 OK 127.0.0.1:6379> mget user:1:name user:1:age 1) "lwh" 2) "3" 127.0.0.1:6379>
-
设置一个对象,值为json字符串来保存一个对象
-
user:{id}:{filed}
-
-
getset 先get再set,规则就按getset来,无论key存不存在,都按getset来
List
在Redis中可以将List作为、栈、队列、阻塞队列
- 实际上是一个链表,left、right 都可以插入值
- 如果key不存在,创建新的链表
- 如果key存在,新增value
- 移除所有值,空链表
- 在两边插入效率最高,对中间元素操作,效率会降低
消息排队、消息队列、堆、栈
- lpush left push
- lrange 显示list 范围range
- rpush right push
- Rpop right pop
- Lpop left pop
- Llen listlength
- lrem remove指定下标
- ltrim trim截取
- Rpoplpush pop再push到别的list
- lset 设置指定下表值
- exists 存在
- Linsert 将某个具体的value插入到某个元素的前面或后面
#=======================================================================
# lpush、lrange、Rpush
127.0.0.1:6379> lpush list one #插入队列左边
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1 #获取全部的值从0到-1,这是作为栈的最顶上的为index 0,
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> rpush list Right
(integer) 4
127.0.0.1:6379> lrange list 0 -1 #插入队列右边
1) "three"
2) "two"
3) "one"
4) "Right"
########################################################################
#Rpop、Lpop 移出元素 lindex 获取下标对应值
127.0.0.1:6379> rpop list
"Right"
127.0.0.1:6379> lindex list 2
"one"
########################################################################
# 返回llen 长度\ lrem 移除
127.0.0.1:6379> llen list
(integer) 3
127.0.0.1:6379> lrem list 2 three #lrem key count value 移除几个,从左边删除的
(integer) 1
########################################################################
#ltrim 截取范围,其余的删除
127.0.0.1:6379> rpush list l1
(integer) 1
127.0.0.1:6379> rpush list l2
(integer) 2
127.0.0.1:6379> rpush list l3
(integer) 3
127.0.0.1:6379> rpush list l4
(integer) 4
127.0.0.1:6379> ltrim list 2 3
OK
127.0.0.1:6379> lrange list 0 -1
1) "l3"
2) "l4"
127.0.0.1:6379>
########################################################################
#rpoplpush 从一个list 的最右边的一个值pop出来push进别的list中
127.0.0.1:6379> rpush list 4 5 6
(integer) 6
127.0.0.1:6379> lrange list
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> rpoplpush list destination
"6"
########################################################################
#linsert 在之前或之后插入
127.0.0.1:6379> linsert list before 3 inserttest #插入在3之前
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "value"
2) "2"
3) "inserttest"
4) "3"
5) "4"
6) "5"
127.0.0.1:6379> linsert list after 4 inserttest2 #插入在4之后
(integer) 7
127.0.0.1:6379> lrange list 0 -1
1) "value"
2) "2"
3) "inserttest"
4) "3"
5) "4"
6) "inserttest2"
7) "5"
127.0.0.1:6379>
Set
集合中的值不能重复,set是无需不重复原则
string和list的元素都是value,set中是member
- sadd
- smembers 查看集合的全部值
- sismember 判断是否存在
- scard 查看一共有几个元素
- srem 移除某一个member
- srandmember 随机抽取几个member
- spop 随机删除几个member
- smove 移动member到另一个set,可以适用于共同关注功能实现
- sdiff difference set 差集 ,结果来自first_key为基准
- sinter intersection set 交集
- sunion union联合 并集
- 将用户放到set中,共同关注、共同爱好、推荐好友
127.0.0.1:6379> smembers set1
1) "m4"
2) "m3"
3) "m1"
4) "m2"
127.0.0.1:6379> smembers set2
1) "m3"
2) "m6"
3) "m1"
4) "m2"
5) "m5"
127.0.0.1:6379> sdiff set1 set2
1) "m4"
127.0.0.1:6379> sinter set1 set2
1) "m3"
2) "m1"
3) "m2"
127.0.0.1:6379>
Hash
map集合,key - map 本质和string类型没有太大区别,还是一个简单的key - value,像是增加了一层
-
hset hset key field value
-
hget
-
hmset
-
hmget
-
hmget
-
Hmget
-
Hdel 删除
-
hgetall
-
hlen
-
hexists 判断hash中指定字段是否存在
-
hkeys 获取key所有的field
-
hvals 获取所有的value
-
hincrby 递增,参数设置为负数就是递减
-
hsetnx 是否存在,不存在就创建设置,存在就不设置
-
127.0.0.1:6379> hset user:1 name haoyun (integer) 1 127.0.0.1:6379> hget user:1 name "haoyun"
-
做用户信息保存,比用string类型好点,存储经常变动的信息,hash更适合存储对象,
127.0.0.1:6379> hset key field1 value1 field2 value2
(integer) 2
127.0.0.1:6379> hmset key field1 field2
OK
127.0.0.1:6379> hmget key
(error) ERR wrong number of arguments for 'hmget' command
127.0.0.1:6379> hmget key *
1) (nil)
127.0.0.1:6379> hmget key field1 field2
1) "field2"
2) "value2"
127.0.0.1:6379>
ZSet
在set的基础上增加了一个值
可以作为一个排行榜功能,进场刷新,或者任务等级排序之类的,都可以做
-
127.0.0.1:6379> zadd myzset 1 one (integer) 1 127.0.0.1:6379> zadd myzset 2 two 3 three (integer) 2 127.0.0.1:6379> zrange myzset 0 -1 1) "one" 2) "two" 3) "three" 127.0.0.1:6379>
-
排序
-
zrangebyscore
127.0.0.1:6379> zadd salary 3000 hao 2000 yun 100 lwh (integer) 3 127.0.0.1:6379> zrangebyscore salary -inf +inf withscores #与分数 1) "lwh" 2) "100" 3) "yun" 4) "2000" 5) "hao" 6) "3000" 127.0.0.1:6379> zrangebyscore salary -inf +inf #正负无穷 1) "lwh" 2) "yun" 3) "hao"
-
zconut
-
zcard 获取有序集合的个数
三种特殊数据类型
- geospatial
- hyperloglog
- bitmaps
Geospatial
可以推算地理位置的信息,两地之间的距离,方圆几公里之内的人
需要注意:
- 地球南北两极无法直接添加,
- 一般会下载城市数据,直接通过Java程序一次性导入
- 有效经纬度范围从-180到180,超出范围时会返回错误,
- key由(纬度,经度,名称)构成
查看官网,一共有六个相关命令
-
add、dist、hash、pos、radius、rediusbymember
-
geodist 返回两个给定位置之间的距离
-
geohash 返回geohash对位置进行的编码,用于内部调试,一般用不到
-
geopos 返回指定member的经纬度信息
-
georadius : 根据半径查找,需要给定中心点数据
-
georadiusbymember : 也是根据半径查找,但是中心点是已经存在的member
-
zrange 遍历member
-
zrem 移除member
-
127.0.0.1:6379> geoadd key:city 116 99 beijing1 (error) ERR invalid longitude,latitude pair 116.000000,99.000000 127.0.0.1:6379> geoadd key:city 116.23128 40.220779 beijing (integer) 1 127.0.0.1:6379> geoadd key:city 31.40527 121.48941 shanghai (error) ERR invalid longitude,latitude pair 31.405270,121.489410 127.0.0.1:6379> geoadd key:city 121.48941 31.40527 shanghai (integer) 1
-
纬度经度,member名称,geoadd可以一次添加多个
-
可以使用geopos读取地理位置
-
geodist,输出两地距离,加上unit单位,设置输出距离单位
-
127.0.0.1:6379> geodist key:city beijing shanghai "1088645.3557" 127.0.0.1:6379> geodist key:city beijing shanghai km "1088.6454" 127.0.0.1:6379>
-
m、km、mi 英里、ft 英尺
-
-
我附近的人功能,通过半径来查询,获取附近的人的定位地址
-
georadius命令来实现,longitude纬度、latitude经度、radius半径 单位,输入查询位置的经纬度就能从key集合中找到在半径范围的元素
-
127.0.0.1:6379> georadius key:city 110 30 500 km (empty array) 127.0.0.1:6379> georadius key:city 110 30 5000 km 1) "shanghai" 2) "beijing" 127.0.0.1:6379> georadius key:city 110 30 5000 km withcoord 1) 1) "shanghai" 2) 1) "121.48941010236740112" 2) "31.40526993848380499" 2) 1) "beijing" 2) 1) "116.23128265142440796" 2) "40.22077919326989814" 127.0.0.1:6379> georadius key:city 110 30 5000 km withdist 1) 1) "shanghai" 2) "1109.3250" 2) 1) "beijing" 2) "1269.4847" 127.0.0.1:6379> georadius key:city 110 30 5000 km withhash 1) 1) "shanghai" 2) (integer) 4054807796443227 2) 1) "beijing" 2) (integer) 4069896088584646 127.0.0.1:6379> georadius key:city 110 30 5000 km withdist asc count 1 1) 1) "shanghai" 2) "1109.3250" 127.0.0.1:6379>
- 后面跟了几个参数,withdist、withcoord、withhash、asc、desc、count
- Withdist:返回元素位置的同时,把与中心之间相差的距离一同返回
- withcoord : 将元素经纬度一同返回
- withhash : 返回经过geohash编码的有序集合分值,主要用于底层调试,作用不大
- asc : 根据中心的位置,从近到远的方式返回位置元素
- desc:从远到近的方式返回元素
- count :获取前n个匹配元素,对于提高效率是有效的
- 后面跟了几个参数,withdist、withcoord、withhash、asc、desc、count
HyperLogLog
是一种概率数据结构,计数唯一事物,从技术上讲估计一个集合的基数,通常计数唯一项需要使用成比例的内存,因为需要记录使用过的元素,以免多次记录,但是hyperloglog的算法可以用内存换精度,虽然有误差,但是误差小于1%,算法的神奇之处在于只需要很小的内存,最大也不超过12k,类似集合的功能,能记录2^64的计数,从内存的角度来说,hyperloglog是首选
能用在网页的UV
- 传统方式,set保存用户的id,用户可能是uuid,这样可能占用巨大的内存
- 但是只是需要计数功能并不需要保存用户的id
7.0.0.1:6379> pfadd loglog2 6 7 8 9 0
(integer) 1
127.0.0.1:6379> pfcount loglog1 loglog2
(integer) 10
127.0.0.1:6379> pfmerge loglog1 loglog2
OK
127.0.0.1:6379> pfcount loglog1
(integer) 10
127.0.0.1:6379>
- pfadd
- pfcount 计数
- pfmarge 合并 //合并到第一个key
Bitmaps
统计用户信息,活跃与不活跃,登录未登录只有两种状态的数据,可以使用BitMaps
可以用作打卡功能实现,到达一定数目之后进行统计,判断预期数目与统计得出的数目是否达到预期
-
setbit 中的offset是偏移量,可以看作下标,value只能是0或1
-
getbit
-
bitcount 统计key offset 为1的个数
-
bitpos 查看 key offset 为0或1的位置,并且可以设置range
-
127.0.0.1:6379> bitpos bit1 1 0 -1 (integer) 0 127.0.0.1:6379> getbit bit1 0 (integer) 1 #查询bit1 范围从0到-1,bit值为1的元素下标
-
-
bitop 对一个或多个保存二进制位的字符串key进行位元操作,将结果保存在deskkey上
-
and、or、not、xor
-
除了not之外,其他都能加入多个key进行运算
-
127.0.0.1:6379> setbit bit1 0 1 (integer) 0 127.0.0.1:6379> setbit bit1 1 1 (integer) 0 127.0.0.1:6379> setbit bit2 0 1 (integer) 0 127.0.0.1:6379> setbit bit2 1 0 (integer) 0 127.0.0.1:6379> bitop and bit1 bit2 (integer) 1 127.0.0.1:6379> get bit1 "\x80" 127.0.0.1:6379> getbit bit1 0 (integer) 1 127.0.0.1:6379> getbit bit1 1 (integer) 0 127.0.0.1:6379>
-