redis-命令

切换数据库

默认有16个数据库0-15,切换数据库使用select

1
select 15

删除与保存

flushall:删除所有数据

save:保存,上一条命令的结果即刻同步数据到硬盘

bgsave:和save一样的作用,不同点在于save是停止当前所有的写操作,先进行备份同步,而bgsave是可以一边写一边保存

这两个命令和sql中的提交commit作用一样,会立即生效即同步数据到硬盘

key键

key命令:适用于所有的数据类型的命令

keys *查看所有的key ——————————–> keys命令支持正则匹配

exists key是否存在key,存在返回1,否则返回0

expire key time设置key的过期时间,单位秒

pexpire key time设置key的过期时间,单位毫秒

persist key撤销过期设置

ttl key查看过期时间time to live,-1为永不过期,-2为已近销毁

pttl key查看过期时间,单位毫秒

del key删除key

rename key newkey重命名key

move key dbindex将key移到其它数据库(默认16个:0-15)

randomkey随机返回一个key

type key查看key对应值的存储类型

key命名规范

  1. 单个key支持最大512M

  2. 每个key都是唯一的

  3. key区分大小写

  4. key使用统一的命名格式,使用冒号分隔,用来区分数据以及分类

    1
    2
    3
    4
    5
    eg:
    school:student:1
    school:student:2
    school:teacher:1
    school:teacher:2

    每个key都做到了唯一,而且易于区分,加快查询速度,比如要查询所有的老师信息

    1
    keys school:teacher*

value数据类型

redis支持五种不同的数据类型:

  • string:用来存放字符串
  • list:value为list的有序集合,存储list集合,当值被清空后,键也不复存在了。不存在空的list
  • set:无序不重复数据,与list一样为集合,只不过不允许list中出现重复的数据,而且数据无序
  • zset:有序不重复数据,与set类似,不过是有序的集合。通过给每个元素添加一个score,来判断顺序,元素不可重复,但是score可以重复
  • hash:其value为hash的key-value键值对,适合用来存储对象,这也是最接近sql的一种数据类型,如果比作sql的话就像将字段与值对应起来的关系

string

最大同样可以存储512M

赋值

set key value:key唯一,后面的重复key会覆盖前面的

1
set school:user:1 lanzhan

setnx key value:表示set if not exist,当没有出现过的key才赋值,这样比较安全,推荐使用

1
setnx school:user:1 zhansan

setex key time value:表示set expire,赋值的同时设置过期时间,time单位为秒

1
setex school:user:2 libai

setrange key offset value:从偏移offset开始覆盖指定key的value值,偏移值从0开始计数

1
2
3
4
127.0.0.1:6379> set school:user:3 libai
127.0.0.1:6379> setrange school:user:3 2 shishi
127.0.0.1:6379> get school:user:3
"lishishi"

mset key1 value1 key2 value2....:同时设置一个或多个 key-value 对

1
mset user1 libai user2 hanxing user3 gonsunli

msetnx key1 value1 key2 value2....:如果不存在就赋值if not exists,同理

如果其中一个已经存在,那么整条命令都不会执行

取值

get key:获取指定key的值

getrange key start end:获取key中字符串的子字符串,范围取值

1
2
3
4
5
6
127.0.0.1:6379> set school:user:baijuyi 12345678
OK
127.0.0.1:6379> get school:user:baijuyi
"12345678"
127.0.0.1:6379> getrange school:user:baijuyi 0 3
"1234"

mget key1 key2 ...:获取所有(一个或多个)给定 key 的值

1
mget user1 user2 user3

数字递增/减

将value为数字的这种进行增加或减少,目前来看它的作用在于统计数字

incr key:递增1

decr key:递减1

incrby key num:递增num个

decrby key num:递减num个

list

赋值

lpush key member1 member2 member3:按照顺序将这个list插入数据库,将一个或多个值插入到列表头部

1
lpush user1 1 2 3 4 5

rpush key member1 member2 member3:在列表中添加一个或多个值,尾部

1
rpush user2 1 2 3 4 5

增加

linsert key before/after pivot member:在某个pivot元素前/后插入数据

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> lrange user1 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> linsert user1 before 2 a
127.0.0.1:6379> lrange user1 0 -1
1) "1"
2) "a"
3) "2"
4) "3"

取值

lrange key start end:查看列表指定范围内的元素

1
2
3
4
127.0.0.1:6379> lrange user1 0 2
1) "5"
2) "4"
3) "3"

lrange key 0 -1:查看整条数据

1
2
3
4
5
6
127.0.0.1:6379> lrange user1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
1
2
3
4
5
6
127.0.0.1:6379> lrange user2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

需要注意lpush与rpush的顺序不同,lpush相当于从栈的底部传入数据,最先传入的数据最后到了栈顶

lrange并不属于栈的操作,所以只是简单的将这个list从左到右的显示出来

lindex key index:通过索引获取列表中的元素

1
2
3
4
5
6
127.0.0.1:6379> lrange user1 0 -1
1) "4"
2) "3"
3) "2"
127.0.0.1:6379> lindex user1 0
"4"

删除

lpop key:这个不同于lrange,它属于栈操作,会将数据取出来,并且删除。从栈底取数据

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> lpop user1
"5"
127.0.0.1:6379> lrange user1 0 -1
1) "4"
2) "3"
3) "2"
4) "1"

127.0.0.1:6379> lpop user2
"1"

rpop key:栈顶取数据

1
2
3
4
5
6
127.0.0.1:6379> rpop user1
"1"
127.0.0.1:6379> lrange user1 0 -1
1) "4"
2) "3"
3) "2"

lrem key count member:删除count个value值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> rpush user3 1 2 2 3 3 3
(integer) 6
127.0.0.1:6379> lrange user3 0 -1
1) "1"
2) "2"
3) "2"
4) "3"
5) "3"
6) "3"
127.0.0.1:6379> lrem user3 2 3 # 删除2个3
(integer) 2
127.0.0.1:6379> lrange user3 0 -1
1) "1"
2) "2"
3) "2"
4) "3"

ltrim key start_index end_index:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> rpush user4 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> lrange user4 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> ltrim user4 2 4 # 只保留索引为2到4的元素
OK
127.0.0.1:6379> lrange user4 0 -1
1) "3"
2) "4"
3) "5"

rpoplpush source destination:移出source的栈顶元素,并加入到destination的栈底

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
127.0.0.1:6379> rpush user1 1 2 3 4
(integer) 4
127.0.0.1:6379> rpush user2 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange user1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> lrange user2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> rpoplpush user1 user2
"4"
127.0.0.1:6379> lrange user1 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> lrange user2 0 -1
1) "4"
2) "1"
3) "2"
4) "3"
5) "4"

列表长度

llen key:获取列表长度

1
2
3
4
5
6
7
127.0.0.1:6379> lrange user2 0 -1
1) "2"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> llen user2
(integer) 4

set

增加

sadd key member1 member2 member3:value不允许重复,如果有重复则会自动去掉多余的重复数据。在给之前存在的key添加值时,如果出现重复数据也会自动忽略这些重复数据,只添加不重复的那些数据

1
2
3
4
5
6
127.0.0.1:6379> sadd user1 1 2 2 3 3 3
(integer) 3
127.0.0.1:6379> smembers user1
1) "1"
2) "2"
3) "3"

取值

smembers key:查看key的value值

1
smembers user1

srandmember key num:从集合中随机去num个元素

1
2
3
4
5
127.0.0.1:6379> smembers user1
1) "1"
2) "3"
127.0.0.1:6379> srandmember user1 1
1) "3"

判断

sinmember key member:判断某个元素value是否属于key,存在返回1,否则返回0

1
2
3
4
5
6
7
8
127.0.0.1:6379> smembers user1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> sismember user1 1
(integer) 1
127.0.0.1:6379> sismember user1 4
(integer) 0

删除

srem key member:删除集合中指定的元素

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> smembers user1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> srem user1 2
(integer) 1
127.0.0.1:6379> smembers user1
1) "1"
2) "3"

spop key:与list的pop操作不同,这里的pop是随机删除一个元素

1
spop user1

移动

smove key1 key2 member:将key1中的value移到key2中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.0.0.1:6379> sadd user1 1 2 3
(integer) 3
127.0.0.1:6379> sadd user2 2 3 4
(integer) 3
127.0.0.1:6379> smove user1 user2 1
(integer) 1
127.0.0.1:6379> smembers user1
1) "2"
2) "3"
127.0.0.1:6379> smembers user2
1) "1"
2) "2"
3) "3"
4) "4"

集合长度

scard key:获取集合元素个数

1
2
127.0.0.1:6379> scard user1
(integer) 3

集合运算

会自动去重

sdiff key1 key2:差集,key1 差 key2

sinter key1 key2:交集, key1 交 key2

sunion key1 key2:并集,key1 并 key2

zset

增加、更新

zadd key score1 member1 score2 member2:向有序集合添加一个或多个成员,或者更新已存在成员的分数

1
zadd user3 10 a 20 b 20 c 40 d

查看

zrange key index_start index_end:查看范围内的元素

1
2
3
4
5
127.0.0.1:6379> zrange user3 0 -1
1) "a"
2) "b"
3) "c"
4) "d"

zrevrange key index_start index_end:查看范围内的元素,倒序

1
2
3
4
127.0.0.1:6379> zrevrange user3 0 -1
1) "c"
2) "b"
3) "a"

zrange key index_start index_end withscores:查看范围内的元素,以及成员分数

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> zrange user3 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "20"
5) "c"
6) "20"
7) "d"
8) "40"

zrangebyscore key min_score max_score limit index count:查看分数范围内的成员(可选用limit来再次筛选),score为闭合区间

1
2
3
4
5
6
127.0.0.1:6379> zrangebyscore user3 20 40
1) "b"
2) "c"
3) "d"
127.0.0.1:6379> zrangebyscore user3 20 40 limit 0 1
1) "b"

如果要不闭合使用(

1
2
3
4
127.0.0.1:6379> zrangebyscore user3 (20 40
1) "d"
127.0.0.1:6379> zrangebyscore user3 (20 (40
(empty list or set)

zrevrangebyscore key max_score min_score limit index count:先倒叙再查看分数范围内的成员(可选用limit来再次筛选),score为闭合区间

zrank key member:查看元素的index

1
2
3
4
5
6
127.0.0.1:6379> zrange user3 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> zrank user3 c
(integer) 2

zrevrank key member:先倒序,再查看其索引

zscore key score:查看元素对应的score

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> zrange user3 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "20"
5) "c"
6) "20"
127.0.0.1:6379> zscore user3 a
"10"

删除

zrem key member:删除指定memeber元素,连同score一起删除

1
zrem user3 d

长度

zcard key:计算集合长度,不包含score

1
2
127.0.0.1:6379> zcard user3
(integer) 3

zcount key min_score max_score:计算指定分数内的成员数

1
2
3
4
5
6
127.0.0.1:6379> zrangebyscore user3 20 40
1) "b"
2) "c"

127.0.0.1:6379> zcount user3 20 40
(integer) 2

hash

增加、更新

由于field也为key关键字,所以也不能重复,重复会覆盖

hset key field value:一个一个的赋值

hsetnx key field value:不存在的话再赋值if not exists

hmset key field1 value1 field2 value2...:可一次进行多个赋值,更加实用

1
hmset user10 id 1 name libai age 18

hincrby key field num:对整数的value进行num个数的增加

1
2
3
4
5
6
127.0.0.1:6379> hget user10 id
"1"
127.0.0.1:6379> hincrby user10 id 3
(integer) 4
127.0.0.1:6379> hget user10 id
"4"

hincrfloat key field num:对浮点数进行num个数的增加

取值

hget key filed:一个一个的取值

hmget key field1 field2....:可一次取多个值

1
hmget user10 id name age

hgetall key:一次获取所有键值对

1
hgetall user10

hkeys key:查看所有的field

hvals key:查看所有的value

删除

hdel key field1 field2:删除hash中的指定键值对

del key:删除所有键值对

判断

hexists key field:判断是否有此field的键值对

长度

hlen key:查看键值对的个数

总结

学了这些数据类型之后发现redis真的可以替代oracle,mysql这些,因为它可以存储它们所能存储的数据,而且更好。

我觉得使用的最多的是hash,其次是string,然后是list,至于set和zset使用的应该比较少吧

不过我还是有些不懂的,前面所学的都是针对一条记录来操作的,那么sql中那些复杂的查询语句,在redis中如何才能查询到结果呢,总不能用循环来一条一条的查吧,有没有对多列数据的操作命令呢?