文章目录

  • key (常用)
  • 1、 String
  • 2、List
  • 3、Set
  • 4、Hash
  • 5、zset (sorted set)


需要记住的常用命令有64个左右

key (常用)

9个命令

keys *

查看当前库的所有键

exists

判断某个键是否存在

type

查看键的类型

del

删除某个键

expire

为键值设置过期时间,单位秒

ttl

查看还有多久过期,-1表示永不过期,-2表示已过期

dbsize

查看当前数据库中key的数量

flushdb

清空当前库

Flushall

通杀全部库

1、 String

(1)String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value

(2)String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

(3)String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

(4)常用操作

16个命令

get

查询对应键值

set

添加键值对

append

将给定的追加到原值的末尾

strlen

获取值的长度

setnx

只有在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++是否是原子操作?

redis不是所有操作都是原子性的 redis incr是原子性吗_redis不是所有操作都是原子性的

2、List

(1)单键多值

(2)Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。它是按照输入的顺序进行排序。

(3)它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差

redis不是所有操作都是原子性的 redis incr是原子性吗_常用操作_02

(4)

redis不是所有操作都是原子性的 redis incr是原子性吗_Redis_03

(5)常用操作

13个命令

lpush/rpush

从左边/右边插入一个或多个值。

lpop/rpop

从左边/右边吐出一个值。 值在键在,值光键亡。

Rpop/lpush

从列表右边吐出一个值,插到列表左边

lrange


按照索引下标获得元素(从左到右)

lindex

按照索引下标获得元素(从左到右)

llen

获得列表长度

linsert before

在的后面插入 插入值

lrem

从左边删除n个value(从左到右)

3、Set

(1)Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的**,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口**,这个也是list所不能提供的。Set默认按照从小到大的顺序进行存储的。

(2)的复杂度都是O(1)。

(3)常用操作

10个命令

sadd …

将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。

smembers

取出该集合的所有值。

sismember

判断集合是否为含有该值,有返回1,没有返回0

scard

返回该集合的元素个数。

srem …

删除集合中的某个元素。

spop

随机从该集合中吐出一个值。抽奖

srandmember

随机从该集合中取出n个值。 不会从集合中删除

sinter

返回两个集合的交集元素。

sunion

返回两个集合的并集元素。

sdiff

返回两个集合的差集元素。

4、Hash

(1)Redis hash 是一个键值对集合

(2)Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象

redis不是所有操作都是原子性的 redis incr是原子性吗_redis不是所有操作都是原子性的_04

(3)类似Java里面的Map<String,Object>

(4)分析一个问题: 现有一个JavaBean对象,在Redis中如何存?

  • 第一种方案: 用户ID为key ,VALUE为JavaBean序列化后的字符串

redis不是所有操作都是原子性的 redis incr是原子性吗_字符串_05

缺点: 每次修改用户的某个属性需要,先反序列化改好后再序列化回去。开销较大

  • 第二种方案: 用户ID+属性名作为key, 属性值作为Value.

redis不是所有操作都是原子性的 redis incr是原子性吗_常用操作_06


缺点: 用户ID数据冗余

  • 第三种方案: 通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题

redis不是所有操作都是原子性的 redis incr是原子性吗_Redis_07

(5)常用操作

8个命令

hset

给集合中的 键赋值

hget

从集合 取出 value

hmset …

批量设置hash的值

hexists key

查看哈希表 key 中,给定域 field 是否存在。

hkeys

列出该hash集合的所有field

hvals

列出该hash集合的所有value

hincrby

为哈希表 key 中的域 field 的值加上增量 increment

hsetnx

将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在

5、zset (sorted set)

(1)Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的sadd每个成员都关联了一个评分(score) ,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。zset也是按照从小到大的顺序进行存储的,只是它是按照关联的评分进行排序的。

(2)因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

(3)常用操作

8个命令

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开始。

(4)思考: 如何利用zset实现一个文章访问量的排行榜?

redis不是所有操作都是原子性的 redis incr是原子性吗_redis不是所有操作都是原子性的_08

改为手机

zrange key 0- -1 withscores

zrevrange key 0 -1