Redis学习笔记(二)入门基础

本文最后更新于:December 3, 2021 pm

Redis 是当前互联网世界最为流行的 NoSQL(Not Only SQL)数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis 具备一定持久层的功能,也可以作为一种缓存工具。对于 NoSQL 数据库而言,作为持久层,它存储的数据是半结构化的,这就意味着计算机在读入内存中有更少的规则,读入速度更快。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

目录

1.基础命令

1
ps -ef|grep redis

1.1 切换数据库(select)

Redis 默认有16个数据库(可在redis.conf文件中进行查看),并且默认使用的是第0个数据库。使用 select index 进行切换数据库。

1
select 1 //切换为第1个数据库

1.2 查看数据库大小(dbsize)

使用 dbsize 进行查看当前数据库的大小。大小指的是数据库中数据的条数。

1
dbsize

1.3 插入键值对(set)

使用 set key value 进行插入数据。使用 get key 获取数据。

1
2
set name loong
get name

1.4 查看所有键(key)

使用 keys * 可以查看当前数据库中的所有键。

1
keys *

1.5 删除(del)

使用 del key 删除已存在的key。

1
2
del key
del key1 key2 key3 ....

1.6 清除数据库

1.6.1 清空所有数据库数据(flushall)

1
flushall

1.6.2 清空当前数据库数据(flushdb)

1
flushdb

1.7 判断是否存在(exists)

1
exists name

判断 keyname 的是否存在,如果不存在 (integer) 0,存在 (integer) 1

1.8 移除数据(move)

1
move name 1

移除当前数据库中的 keyname 的数据。其中的 1 表示当前数据库。

1.9 设置过期时间(expire)

给数据设置过期时间。过了过期时间就会被删除。

1
expire key sconds

给指定的 key 设置过期时间(秒)。

1.9.1 查看剩余时间(ttl)

1
ttl key

查看 key 的过期剩余时间。

1.9.2 创建并设置过期时间(setex、setnx)

  1. 创建并设置过期时间。
1
2
setex key seconds "abc"
setex name 10 "abc"
  1. 如果不存在key,就创建。存在就不做任何事。
1
setnx key value

1.10 查看类型(type)

1
type key

2.五大数据类型

2.1 String

2.1.1 追加(append)

1
2
set name lo
append name "oong" //双引号可要可不要,推荐加上

如果 key 不存在,则会自动创建。

2.1.2 获取长度(strlen)

1
strlen key

2.1.3 加减值

2.1.3.1 加值1(incr)
1
2
set age 0
incr age //加1
2.1.3.2 减值1(decr)
1
decr age //减1
2.1.3.3 加特定值(incrby)
1
incrby age 23 //加23
2.1.3.4 减特定值(decrby)
1
decrby age 19 //减13
2.1.3.5 截取子串(getrange)

注意:区间是闭区间的!!!,而不是左闭右开。下标也是从0开始的。

1
2
getrange key start end  // 获取子串[start,end]
getrange key start -1 // 获取全部字符,等效于get命令
2.1.3.6 替换子串(setrange)

替换指定位置开始的子字符串。

1
2
3
4
setrange key offset value

set key "abcdef"
setrange key 1 xx //axxdef

2.1.4 批量操作

2.1.4.1 批量创建(mset)
1
mset key1 value1 [key2 value2 .....]

如果不存在,就创建:

1
msetnx key1 value1 [key2 value2]

注意:这种属于原子性操作,要么都成功,要么都失败。即:要求key都满足不存在或存在,如果既有存在的key,又有不存在的key,则整个命令都执行失败!!!

2.1.4.2 批量获取(mget)
1
mget key1 [key2 key3 ....]

2.1.5 组合命令(getset)

getset key value
get 操作然后再 set 操作。可自行理解以下代码的结果:

1
2
3
getset ttf tothefor //(nil)
getset ttf www //"tothefor"
getset ttf com //"www"

注意:没有 setget 组合命令!!!

2.2 List

可以理解成是一个链表。其中的值可以是重复。并且所有的 list 命令 一般 都是以 l 开头的。

2.2.1 添加数据

2.2.1.1 头部进行添加(lpush)

是在 list头部 进行添加。

1
lpush key value1 [value2 ...]

示例:

1
lpush list one two three //three two one

也可以理解成是在左边进行添加。因为是从左到右读数据。

2.2.1.1 尾部进行添加(rpush)
1
rpush list one two three //one two three

也可以理解成是在右边进行添加。因为是从左到右读数据。

2.2.2 获取数据

2.2.2.1 范围数据(lrange)
1
lrange key start end

示例:

1
2
lrange list 0 -1 //获取全部
lrange list 0 1 //获取[0,1]范围内的数据
2.2.2.2 获取指定数据(lindex)

注意:没有rindex命令。

1
2
lindex key index
lindex list 1 //下标从0开始

2.2.3 获取列表的长度(llen)

1
2
llen key
llen list

2.2.4 移除特定值(lrem)

lrem key count value

移除指定的value,其中的count指定的是移除的个数。

1
lrem list 1 one

2.2.5 截取数据(ltrim)

用来截取保留一部分数据。

ltrim key start end

只保留[start,end]中的数据。

1
ltrim list 1 3

2.2.6 移动数据(rpoplpush)

将一个list中的最后一个数据删除,并将该删除数据移到另外一个list中。

rpoplpush source destination

将 source 中的数据删除,并将其添加至 destionation 中。

1
rpoplpush list mylist

2.2.7 删除数据

2.2.7.1 头部删除(lpop)

同样,也可以理解成是在左边进行删除。

2.2.7.1 尾部删除(rpop)

同样,也可以理解成是在右边进行删除。

示例:

1
2
3
4
rpush list one two three //one two three

lpop list //two three
rpop list //two

2.2.8 更新数据(lset)

没有 rset!!!
用此命令前需要判断key是否存在,如果不存在就进行此命令,则会报错。
判断key是否存在:

1
exists key

当key存在时,就可以进行更新操作。

lset key index value

index 表示被更新位置的下标,value 为新值。

1
lset list 1 tototo

2.2.9 插入数据(linsert)

将一个新值插入到已有的值的前面或后面。

linsert key before|after pivot value

在pivot之前或之后插入value。

1
2
linsert list before "two" "dou" //在two前面插入dou
linsert list after "two" "dou" //在two后面插入dou

注意:没有 rinsert 命令。

2.4 Set

set中的值是无序无重复值的。并且所有的 set 命令 一般 都是以 s 开头的。

2.4.1 插入数据(sadd)

sadd key member1 [member2 ….]

1
sadd set "one" "two" "three"

2.4.2 查询数据(smembers)

smembers key

查询key下的所有数据。

1
smembers set

2.4.3 判断是否包含特点数据(sismember)

sismember key member

查询key中是否包含member。

1
sismember set "one"

2.4.4 查询个数(scard)

scard key

查询key中的总数据个数。

1
scard set

2.4.5 移除指定数据(srem)

srem key member1 [member2 ….]

在key中移除数据member1。

1
srem set two three

2.4.6 随机移除数据(spop)

spop key [count]

在key中随机移除1个(默认)或count个数据。

1
spop set 1

2.4.7 随机取值(srandmember)

srandmember key [count]

从key中随机取出1个(默认)或count个数据。

1
srandmember set 1

2.4.8 移动数据(smove)

将一个set中指定的值移到另外一个set中。

smove source destination member

将source集合中的member数据移动到destination中。

1
smove set1 set2 two

2.4.9 数学中集合操作

2.4.9.1 差集(sdiff)

sdiff key [key1 ….]

1
sdiff key1 key2
2.4.9.2 交集(sinter)

sinter key [key1 ….]

1
sinter key1 key2
2.4.9.3 并集(sunion)

sunion key [key1 ….]

1
sunion key1 key2

2.5 Hash

可以理解成一个Map集合。即存储形式是 key-map ,而其中的map又是 key-value 形式的,所以存储的数据是map形式的。和之前的key-value形式一样,这里只不过是将value变成了key-value。并且所有的 hash 命令 一般 都是以 h 开头的。

2.5.1 存储数据(hset)

hset key field value

其中的field为字段名。

1
hset myhash field1 loong

2.5.2 提取数据(hget)

hget key field

1
hget myhash field1

2.5.3 批量存储数据(hmset)

hmset key field value [field value ….]

1
hmset myhash field1 lee field2 loong

注意:如果key和field已经存在了,则将会用新value替换旧value。

2.5.4 批量提取数据(hmget)

hmget key field [field ….]

1
hmget myhash field1 field2

2.5.5 获取全部键值对(hgetall)

hgetall key

获取的是所有的键值对数据,是所有的键和所有的值,即map<key,value>。所以,显示的数据是一行field,一行value。

1
hgetall myhash

2.5.6 删除数据(hdel)

hdel key field [field ….]

1
hdel myhash field1

2.5.7 获取总键值对数(hlen)

hlen key

获取的是键值对形式的总数量,即字段总数。

1
hlen myhash

2.5.8 判断字段是否存在(hexists)

hexists key field

1
hexists myhash field1

2.5.9 获取所有的key(hkeys)

hkeys key

获取的只是所有的字段中的key,也就是map中的key。

1
hkeys myhash

2.5.10 获取所有的value(hvals)

hvals key

获取所有的value。

1
hvals myhash

2.5.11 增减值(hincrby)

hincrby key field increment

1
hincrby myhash field1 1 //给field1加1

2.5.12 不存在则创建(hsetnx)

hsetnx key field value

如果key不存在,则创建。存在则创建失败。

1
hsetnx myhash field3 to

2.6 有序集合(sorted set)

有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。正是通过分数来为集合中的成员进行的排序。有序集合的成员是唯一的,但分数(score)却可以重复。(理解上也可以把set中的map中的key,当成这里的score。只是理解上!)

2.6.1 插入数据(zadd)

zadd key [nx|xx] [ch] [incr] score member [score member ….]

1
zadd zset 20 loong 1 lee 5 dra  //默认情况下会按照score进行升序排序

2.6.2 获取数据(zrange)

1
zrange zset 0 -1 //获取全部的member,不包含score

2.6.3 排序

2.6.3.1 升序排序(zrangebuscore、zrange)

返回有序集合中指定分数区间的成员列表。

  1. zrangebyscore key min max [withscores] [limit offset count]

其中,min和max表示范围。withscores 表示显示 score (默认情况下是不显示的)。具有相同分数值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。
默认情况下,区间的取值使用闭区间 (小于等于或大于等于),也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。如下:

1
2
ZRANGEBYSCORE zset (1 5  # 1 < score <= 5,即 (1,5]
ZRANGEBYSCORE zset (5 (10 # 5 < score < 10 ,即 (5,10)

可查看以下代码运行的结果的差别。

1
2
3
4
5
zrangebyscore zset -inf +inf  # 显示整个有序集且只显示member
zrangebyscore zset -inf +inf withscores #显示score和member

zrangebyscore zset -inf 5 #只排序显示-inf到score等于5的范围,即 [-inf,5]
zrangebyscore zset 1 (5 # [1,5)
  1. zrange key start end [withscore]
1
2
zrange zset 0 -1 withscores  # 显示全部
zrange zset 1 2 withscores # 显示下标区间1至2的
2.6.3.2 降序排序(zrevrange)

zrevrange key start stop [withscore]

成员的位置按分数值递减(从大到小)来排列。具有相同分数值的成员按字典序的逆序(reverse lexicographical order)排列。此命令的使用同 arange 一样。

对比示例:可查看效果进行对比。

1
2
3
zrange zset 0 -1 withscores
zrevrange zset 0 -1 withscores
zrangebyscore zset -inf +inf withscores

2.6.4 移除指定数据(zrem)

zrem key member [member ….]

1
zrem zset loong

2.6.5 获取数据个数(zcard)

zcard key

1
zcard key

2.6.6 获取指定区间分数的成员数(zcount)

zcount key min max

1
zcount zset 0 10