Redis的数据类型

Redis官网:Redis官网地址 Redis中文网地址:Redis中文网地址

Redis有5种基本类型和3种特殊类型,分别为Strings,Lists,Sets,sorted sets(Zsets),Hashes和BitMaps,Hyperloglogs,Geospatial,还有redis的一些常识,比如说redis默认有16个数据库,可以用select index来选择用那个库等,将会在下一篇说一下,下面介绍一下每一种数据类型的常用命令。

1.redis的5中基本数据类型

1.1 String

redis默认选择第一个库,也可以自己选:select index

设置一个值:set key value
例如:set name tom

一次设置多个值:mset key1 value1 key2 value2 …
例如:mset addr beijing month july

追加字符串: append key value
例如:append name honey 追加成功返回整个字符串的长度

获取字符串:get key
例如: get name 就得到tomhoney

同时获取多个值:mget key1 key2 …

获取字符串的长度:strlen key
例如:strlen name

获取所有的key: keys *

判断某个key是否存在:exists key
例如:exists name 存在则返回1

自增运算:incr key
例如:set age 13
incr age 每次加一

自定义自增:incrby key value
例如: incrby age 6 这样age就加6

自减运算:decr key
例如:decr age 每次减一

自定义自减:decrby key value
例如:decrby age 6 这样age就减6

获取某个范围的字符串:getrange key start end start索引从0开始
例如:getrange name 0 2 这样就获取到tom
getrange name 0 -1 这样就获取整个字符串tomhoney

替换某个范围的字符串:setrange key index value
替换从指定索引处的字符串
例如:setrange name 1 xxxx
则name的值就变成了txxxxney

设置某个key的过期时间:setex key time value
例如:setex k1 30 v1 设置k1的值为v1,过期时间为30秒
还可以用expire命令来设置:expire key time

查看某个key的剩余时间:ttl key
例如:ttl k1
返回值就是剩余的时间,单位是秒

不存在再设置:setnx key value
如果key不存在,则创建key,返回1,key存在则返回0,创建失败
分布式锁会经常用到

同时设置多个值:msetnx key1 value1 key2 value2 …
msetnx是一个原子操作,key1 key2只要有一个存在,则全部设置失败,要么以其成功要么一起失败
注意:redis的单次操作具有原子性,但是redis的事务不具有原子性

使用场景:
统计比如粉丝数,计数器等等

1.2 List

所有的List命令都是以l开头的,可以把list类型的数据当成队列,栈等数据结构

从list的左边插入一个或多个元素:lpush key value
例如:lpush list one

从list的右边插入一个或多个元素:rpush key value
例如:rpush list two

获取list中的值:lrange key start end
获取key中从start开始,到end结尾的数据
例如:lrange list 0 1
返回值为:one two
lrange list 0 -1
是获取所有值

移除list左边的第一个元素:lpop key
返回值为被移除的元素one

移除list右边的第一个元素:rpop key
返回值为被移除的元素two

移除list集合中指定的元素:lrem key number valeu
移除key列表中数量为number个值为value的元素

根据索引获取集合中的元素:lindex key index
获取key列表中索引为index的元素

获取list集合的长度:llen key
获取key列表的长度

裁剪list集合中的一部分作为list集合中的元素:ltrim key start end
把key集合从索引为start处截取,到索引为end位置处,作为一个新key集合

移出列表的最后一个元素,并移动到新的列表中:rpoplpush key1 key2
移除key1集合中的最后一个元素作为key2集合中的第一个元素

将list列表中指定下标的元素替换为另一个值,如果下标不存在就报错:
lset key index value
将key集合中索引为index的元素的值改为value,index不存在则报错

在list列表中指定元素前面插入值:linsert key before value1 value2
在key集合中元素值为value1的前面插入值为value2的元素

1.3 Set

向set集合中添加元素:sadd key value
向key集合中添加value值,可以一次添加一个或多个值

查看set集合中所有的元素:smembers key
查看key集合中所有的元素

判断某个值是不是在集合中:sismember key value
判断value是否在key集合中,存在返回1,不存在返回0

获取集合中元素的个数:scard key
获取key集合中元素的个数

删除set集合中指定值的元素:srem key value
删除key集合中值为value的元素

由于set是一个无序集合,所以可以随机抽取元素:srandmember key number
从key集合中随机抽取number个元素

随机删除set集合中的一些值:spop key number
从key集合中随机删除number个元素

把指定元素从一个set集合移动到另一个set集合中:
smove key1 key2 value
把key1集合中的value移动到key2集合中

1.4 Zset

添加元素:zadd set score1 value1 score2 value2 …
可以设置一个或多个分数为score,值为value的元素,score用于排序

从小到大排序:zrange salary 0 -1
或则:zrevrangebyscore salary -inf +inf
根据score的大小从小到大排序

从大到小排序:zrevrangebyscore salary +inf -inf
根据score的大小从大到小排序

显示全部用户并且带score的排序:从大到小
zrevrangebyscore salary +inf -inf withscores

移除元素:zrem salary value
移除salary集合中值为value的元素

hash集合中元素的个数:zcard salary
获取salary集合中元素的个数

获取指定区间内的元素数量:zcount zset score1 score2
获取分数从score1 开始到score2结束的区间内元素的数量

1.5 Hash

hash是一个map集合,放到redis中相当于key-map,这样的数据结构。

设置一个值:hset key field1 value1
向key集合中设置一个字段名为filed1,值为value1的元素

设置多个值:hmset key field1 value1 field2 value2 …
向key集合中设置多个字段

获取hash集合中所有数据:hgetall key
获取key集合中所有数据

删除指定的key字段:hdel key field1
删除key集合中字段为field1的元素

获取hash集合中键值对的数量:hlen key

判断指定hash集合中的字段是否存在:hexists key field1
判断key集合中是否存在字段名为field1的元素,存在返回1

获取所有的key:hkeys key

获取所有的value:hvals key

自定义增量运算:hincrby myhash field1 2
给myhash集合中字段名为field1的元素值加2,如果为-2,就是减2

如果不存在则设置:hsetnx hash field value
如果hash集合中字段名为field的字段不存在则设置成功,否则失败

2 三种特殊的数据类型

2.1 geospatial 地理位置

添加地理位置:geoadd china:city 经度 纬度 城市名
添加成功返回1
一般这样的数据不会一个一个导入,会有专门的数据包导入

获取指定城市的经纬度:geopos china:city 城市名
返回值为对应的经纬度

获取两个位置之间的距离: geodist china:city nanjing shanghai km
后面的km是单位,有米m,千米km,英里mi,英尺ft

指定位置多少范围内的所有城市:georadius china:city 经度 纬度 距离 单位
例如:georadius china:city 110 30 1000 km
返回值带有经纬度的:
georadius china:city 110 30 1000 km withcoord

获取指定的城市个数:
georadius china:city 110 30 1000 km withcoord count 2
获取两个城市

找出位于指定元素周围的其他元素:
georadiusbymember china:city nanjing 1000 km

返回一个或者多个位置元素的geohash表示,该命令将返回11个字符的geohash字符串,如果两个字符串越接近,表示两个元素的距离越近
geohash china:city nanjing shanghai

geo底层实现原理其实就是zset,比如我们可以使用
zrange china:city 0 -1
查询所有的元素
使用zrem china:city nanjing
来移除元素

2.2 Bitmaps

设置数据:setbit mybit 0 0
设置mybit中索引为0处的值为0,能设置的值只能为0或则1两个状态

获取指定数据:getbit mybit 0
获取指定索引处的数据值

统计值为1的个数:bitcount mybit

2.3 Hyperloglogs 基数统计

创建一组元素:
pfadd mylog a b c d …

统计第一组元素的个数:
pfcount mylog

合并两个组的元素:
pfmerge mylog3 mylog1 mylog2
合并mylog1和mylog2组元素到mylog3中