常见的命令

keys * 查看当前库的所有键
exists 判断某个键是否存在
type 查看键的类型
del 删除某个键
expire 为键值设置过期时间,单位秒
ttl 查看还有多久过期,-1表示永不过期,-2表示已过期
dbsize 查看当前数据库中key的数量
flushdb 清空当前库
flushall 通杀全部库

一 五大数据类型

1.1 String

字符串
1)在redis中是最基本的数据类型,可以理解为和 memcached 一模一样的类型,一个 key 对于 一个value
2)此类型是二进制安全的,string可以包含任何数据,比如图片或者是序列化对象
3)string类型的值最大可以存储 512M 内容。

get 查询对应键值
set 添加键值对
append 将给定的追加到原值的末尾
strlen 获取值的长度
senx 只有在key 不存在时设置key的值
incr 将key中存储的数字值增1
只能对数字值操作,如果为空,新增值为1
decr 将key中存储的数字值减1
只能对数字之操作,如果为空,新增值为-1
incrby /decrby 步长 将key中存储的数字值增减,自定义步长
mset 同时设置一个或多个key-value对
mget 同时获取一个或多个value
msetnx 同时设置一个或多个key-value对,当且仅当所有给定的key都不存在
getrange <起始位置> <结束位置> 获得值的范围,类似java中的substring
setrange <起始位置> 覆盖所存储的字符串值,从<起始位置>开始
setex <过期时间> 设置键值的同时,设置过去时间,单位秒
getset 以新换旧,设置了新值的同时获取旧值

5)说说 incr key 操作的原子性

  • 所谓原子操作是指不会被线程调度机制打断的操作。这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。
  • 在单线程中,能够在单条指令中完成的操作都可以认为是” 原子操作”,因为中断只能发生于指令之间。
  • 在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。
  • Redis单命令的原子性主要得益于Redis的单线程
  • 思考: java中i++是否是原子操作?

    1.2 hash

    哈希散列
  1. hash 是一个键值对集合。是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象。
  2. 类似Java里面的Map

分析一个问题: 现有一个JavaBean对象,在Redis中如何存?
①方案一:用户ID为key,value为JavaBean序列化后的字符串
缺点:每次修改用户的某个属性需要,先反序列化改好后再序列化回去。开销较大
②档案二:用户ID+属性名作为key,属性值作为Value。
缺点:用户ID数据冗余
③方案三:通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。

hset 集合中的 键赋值
hget 集合 取出 value
hmset 批量设置hash的值
hexists key 查看哈希表 key 中,给定域 field 是否存在。
hkeys 列出该hash集合的所有field
hvals 列出该hash集合的所有value
hincrby 为哈希表 key 中的域 field 的值加上增量 increment
hsetnx 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在

1.3 list

列表
1)单键多值
2)Redis 列表是简单的字符串列表,按照插入的顺序排序,你可以添加一个元素导列表的头部(左边)或者尾部(右边)
3)它的底层实际上是一个双向链表,对于两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

lpush/rpush 从左边/右边插入一个或多个值。
lpop/rpop 从左边/右边吐出一个值。
值在键在,值光键亡。
rpoplpush 列表右边吐出一个值,插到列表左边
lrange 按照索引下标获得元素(从左到右)
lindex 按照索引下标获得元素(从左到右)
llen 获得列表长度
linsert before 的后面插入 插入值
lrem 从左边删除n个value(从左到右)

1.4 set

集合
1)set对外提供的功能与list类似,也是一个列表的功能,特殊之处在于set是可以自动去重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
2)Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。

sadd …. 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
smembers 取出该集合的所有值。
sismember 判断集合是否为含有该值,有返回1,没有返回0
scard 返回该集合的元素个数。
srem …. 删除集合中的某个元素。
spop 随机从该集合中吐出一个值。元素从集合中删除。
srandmember 随机从该集合中取出n个值。
不会从集合中删除
sinter 返回两个集合的交集元素。
sunion 返回两个集合的并集元素。
sdiff 返回两个集合的差集元素。

1.5 zset

有序集合
与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
2)因为元素是有序的,所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

zadd 将一个或多个 member 元素及其 score 值加入到有序集 key 当中
zrange [WITHSCORES] 返回有序集 key 中,下标在 之间的元素
带WITHSCORES,可以让分数一起和值返回到结果集。
zrangebyscore key min max [withscores] [limit offset count] 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
zrevrangebyscore key max min [withscores] [limit offset count] 同上,改为从大到小排列。
zincrby 为元素的score加上增量
zrem 删除该集合下,指定值的元素
zcount 统计该集合,分数区间内的元素个数
zrank 返回该值在集合中的排名,从0开始。
zrevrank 排序从大到小

二 新增的三种数据类型

2.1 BitMaps

  1. BitMaps本身不是一种数据类型,实际上它就是字符串,但是它提供了对字符串进行位操作的方式
  2. 它单独提供一套命令,所以操作BitMaps和String是有所不同的,可以把BitMaps想象成一个元素为0,1的数组,每个元素只能是0,1。所以数组的下标被称为偏移量。
  3. 注意:在第一次初始化BitMaps时,如果偏移量过大,数据比较稀疏,间隔太远,会造成redis的阻塞

命令行操作
1)setbit

  • 格式:setbit <key> <offset> <value> 设置BitMaps中某个偏移量的值(0或者1),注意:偏移量是从0开始
  • 例子:每个独立的用户是否访问过网站存放在BitMaps中,访问记为1,偏移量作为用户id

    1. 127.0.0.1:6379> setbit bit:key:1 0 1
    2. (integer) 0

    2)getbit

  • 格式:getbit <key> <offset>

  • 获取offset对于的值(0/1)

    1. 127.0.0.1:6379> getbit bit:key:1 0
    2. (integer) 1

    3)bitcount

  • 格式:bitcount <key>

  • 获取当前的key中拥有的最大offset

    1. 127.0.0.1:6379> bitcount bit:key:1
    2. (integer) 2

    4)bitop

  • 格式:bitop

  • 操作运算,会将结果存储在 dest_key 中
    1. 127.0.0.1:6379> bitop and res:key bit:key:1 bit:key:2
    2. (integer) 2

    2.2 hyperLogLog

    基数:在一个数据集中{1,3,4,5,7,5,4},基数就是:1,3,4,5,7
    在Redis中,每个HyperLogLog键只需要花费 12KB 的内存,就可以计算出将近 2^64 个不同元素的基数。HyperLogLog只会根据输入的元素来计算基数,不会存储元素本身。

命令行操作
1)pfadd

  • 格式:pfadd ….
  • 添加元素到HyperLogLog指定的键当中

    1. 127.0.0.1:6379> pfadd program 'java'
    2. (integer) 1
    3. 127.0.0.1:6379> pfadd program 'php'
    4. (integer) 1

    2)pfcount

  • 格式:pfcount

  • 计算基数
    1. 127.0.0.1:6379> pfcount program
    2. (integer) 2

    2.3 Geospatial

    GEO:Geography,地理信息,该类型可以支持对圆的经纬度进行各种操作,如:范围搜索,距离计算,经纬度哈希等。

命令行操作:
1)geoadd

  • 格式:geoadd
  • 存储添加位置的经纬度信息

    1. 127.0.0.1:6379> geoadd china_city 121.47 31.23 shanghai 116.38 39.90 beijing
    2. (integer) 2

    2)geopos

  • 格式:geopos

  • 获取某个位置的经纬度信息

    1. 127.0.0.1:6379> geopos china_city beijing
    2. 1) 1) "116.38000041246414185"
    3. 2) "39.90000009167092543"

    3)geodist

  • 格式:geodist

  • 获取两个位置之间的直线距离信息
    1. 127.0.0.1:6379> geodist china_city shanghai beijing km
    2. "1068.1535" # 这里得出两地距离1068KM