redis 入门笔记

redis 入门笔记

redis中文文档

[TOC]

string (字符串)

redis 是一个键值对的数据库,他的数据类型都是 key -> value 这样的类型。

就好比在python中的的dict类型,就好比java中的hashmap类型,和Golang中的map类型这种。

redissting类型中value就是一个字符串。

重要 api

api 参数 功能 时间复杂度
set key value 给一个key设置值 O(1)
get key 获取一个key的值 O(1)
del key 删除一个key-value O(1)
incr key key自增1 O(1)
decr key key自减1 O(1)
incryby key k key增加k O(1)
decrby key k key自减1 O(1)
mset key value ... 设置多个key-value O(n)
mget key ... 获取多个值 O(n)
getset key newValue 获取key对应的旧值并设置新的值为newValue O(1)
append key newValue 将newValue追加到旧的值后面 O(1)
strlen key 获取字符串的长度。 O(1)

实战

# 给键 "name:1" 设置一个值
127.0.0.1:6379> set name:1 xiaoming
OK
# 获取value
127.0.0.1:6379> get name:1
"xiaoming"
# 删除键值对
127.0.0.1:6379> del name:1
(integer) 1
# 验证键值对是否删除
127.0.0.1:6379> get name:1
(nil)
# 获取一个不错在的键值
127.0.0.1:6379> get test:counter
(nil)
# 给一个键值增加1
127.0.0.1:6379> incr test:counter
(integer) 1
# 获取一个计数器的值
127.0.0.1:6379> get test:counter
"1"
# 给一个键自增4
127.0.0.1:6379> incrby test:counter 4
(integer) 5
# 给一个键自减1
127.0.0.1:6379> decr test:counter
(integer) 4
# 获取键的值
127.0.0.1:6379> get test:counter
"4"

TIPS

我们可以用字符串类型的数据结构应用在:

  1. 缓存
  2. 分布式锁
  3. 计数器 (redis是单线程无竞争)

hash (哈希)

特点

redishash数据类型和string类型不同的是在value的部分,可以参考下图的结构。

其中在value中可以有多个field

hash重要的api

api 参数 功能 时间复杂度
hget key field 获取key对应的哈希集中的field对应的value O(1)
hmget key field ... hget的多操作 O(n)
hset key field value 设置key指定的哈希集中指定字段的值。 O(1)
hmset key field ... hset的多操作版本 O(n)
hdel key field [field ...] 返回key对应哈希集中成功移除的field的数量 O(n)
hexists key field 返回1则存在,0则不存在 O(1)
hgetall key 返回key对应的所有field和value O(n)
hkeys key 返回hash key对应的所有field O(n)
hvals key 返回key对应的所有field的key O(n)
hsetnx key field value 设置对应的field的value(如field已经存在,则失败) O(1)
hincryby key field intCounter key对应的field的value自增intCounter O(1)
hincrbyfloat key field floatCounter Hincrby 浮点版 O(1)

list (列表)

特点

在value中是一个一个的元素组成的有序的/元素可以重复的列表

从数据结构上来看,我们可以把redis中的list数据类型看成一个双向队列,我们可以在头和尾分别的出队列入队列

我们还可以对list类型计算长度,删查某个索引的元素

重要的api

api 参数 功能 时间复杂度
rpush key value1 value2 ... 从列表右端插入(1-N个)值。 O(n)
lpush Key value1 value2 ... 从列表的左端插入(1-n)值。 O(n)
linsert Key before after value newValue 在指定的值前
lpop key 从列表左边弹出一个item O(1)
lrem key count value 根据count值,从列表中删除所有value相等的项。 O(n)
ltrim key start end 按照索引范围修剪列表 O(n)
llen key 获取队列的长度 O(1)
lrange key start end 获取指定 O(n)
lindex key index 获取列表指定索引的item O(1)
lset key index newValue 设置列表指定索引值为newValue O(1)
blpop key [key …] timeout 删除,并获得该列表中的第一元素,或阻塞,直到有一个可用,timeout是超时时间,为0这表示一直阻塞
brpop key [key …] timeout blpop的反向版

实战

# 向key 为 "mylist" 的list中想右分别插入 "a", "b", "c"
127.0.0.1:6379> rpush mylist a b c
(integer) 3
# 遍历整个list
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
# 从左边插入 "0"
127.0.0.1:6379> lpush mylist 0
(integer) 4
# 遍历整个list
127.0.0.1:6379> lrange mylist 0 -1
1) "0"
2) "a"
3) "b"
4) "c"
# 从右边取出一个元素
127.0.0.1:6379> rpop mylist
"c"
# 遍历整个list
127.0.0.1:6379> lrange mylist 0 -1
1) "0"
2) "a"
3) "b"

TIPS

使用方法不是最重要的,因为这些api的使用方法我们在官方文档中都是可以查询到的,并且很详细,但是我们应该怎么使用,和吧redis应用在什么场景中才是最关键的。

  1. LPUSH + LPOP = stack 栈
  2. LPUSH + LPOP = queue 队列
  3. LPUSH + LTRIM = capped collection 固定大小的集合
  4. LPUSH + BRPOP = Message Queue 消息队列

set (集合)

特点

redis的集合是无序/不可重复的,和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的。集合最大的优势在于可以进行交集并集差集操作。

重要的api

1.集合内

api 参数 功能 时间复杂度
sadd key member [member ...] 添加一个或者多个元素到集合(key)里,如果menber存在则插入失败 O(n)
srem key member [member ...] 从集合里删除一个或多个元素 O(n)
scard key 计算集合key中元素的个数 O(1)
sismember key member 判断某个menber是否是集合中的元素 O(1)
srandmember key [count] 从集合中随机取出count个元素 O(1)
smember key 获取集合里面的所有元素 O(1)
spop key [count] 随机取出count个元素并且删除这些元素 O(1)

2.集合外

api 参数 功能时间 时间复杂度
sdiff key key ... 做差集 O(n)
sinter key key ... 做交集 O(n)
sunion key key ... 做并集 O(n)

实战

# 向集合 myset 中添加成员
127.0.0.1:6379> SADD myset "one"
(integer) 1
127.0.0.1:6379> SADD myset "two" "three"
(integer) 1
127.0.0.1:6379> smenber myset
(error) ERR unknown command `smenber`, with args beginning with: `myset`,
127.0.0.1:6379> smenbers myset
(error) ERR unknown command `smenbers`, with args beginning with: `myset`,
127.0.0.1:6379> smembers myset
1) "two"
2) "one"
3) "three"
127.0.0.1:6379> scard myset
(integer) 3
127.0.0.1:6379> spop myset
"three"
127.0.0.1:6379> sadd myset "four"
(integer) 1
127.0.0.1:6379> spop
(error) ERR wrong number of arguments for 'spop' command
127.0.0.1:6379> spop myset
"two"

TPIS

SADD = Tagging 标签
SPOP/SRANDMEMBER = random item 随机场景
SADD + SINTER = Social Graph 社交

sorted set (有序集合)

特点

对比set

集合 有序
无重复元素 无重复元素
无序 有序
element element+socre

对比list

列表 有序集合
有重复元素 无重复元素
有序 有序
element element+score

sorted set的结构基本就如下图所示

重要api

api 参数 功能 时间复杂度
zadd key score element ... 向有序集合中添加一个或多个成员 O(logN)
zrem key element ... 删除有序集合中的某个或多个成员 O(n)
Zincrby key increScore element 增加或减少成员的分数 O(1)
zcard key 计算有序集合中成员的个数 O(1)
zrange key start end [withscores] 返回指定索引范围内的升序元素 O(log(N)+m)
zrangebyscore key minScore maxScore [withscore] 返回指定分数范围内的升序元素结果 O(log(N)+m)
zcount key mixScore maxCount 返回分数范围内的成员数量 O(log(N)+m)
zremrangebyrank key start end 在排序设置的所有成员在给定的索引中删除 O(log(N)+m)

实战

# 向有序集合中添加三个成员
127.0.0.1:6379> zadd name:score 70 lihua 89 zhangsan 88 xiaoming
(integer) 3
# 查询有序集合中某个成员的分数
127.0.0.1:6379> zscore name:score xiaoming
"88"
# 查询有序集合中成员的个数
127.0.0.1:6379> zcard name:score
(integer) 3
# 查询有序集合中成员的排名(分数的升序排名)
127.0.0.1:6379> zrank name:score xiaoming
(integer) 1
# 查询有序集合某段索引范围内的排名列表
127.0.0.1:6379> zrange name:score 0 -1 withscores
1) "lihua"
2) "70"
3) "xiaoming"
4) "88"
5) "zhangsan"
6) "89"
# 返回某个分数段内成员的数量
127.0.0.1:6379> zcount name:score 70 80
(integer) 1

主要是给自己学过的东西记录一下

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容