Redis基础

73 阅读8分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

1 基础

在计算机中,数据是存在磁盘中的。然而磁盘有两个指标:

  • 寻址,磁盘的寻址速度是ms毫秒级别的
  • 带宽,一般为几百m或者几G 在内存中的时候:
  • 寻址,内存的寻址速度是nm纳秒级别的
  • 带宽,单通道DDR3的带宽2.7GBps 可见若数据在磁盘里,寻址要比内存中寻址慢十万倍。

2 redis介绍

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 

  • 字符串(strings)
  • 散列(hashes)
  • 列表(lists)
  • 集合(sets)
  • 有序集合(sorted sets) 

范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。

Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

3 下载安装

3.1 先从官网下载压缩包

wget http://download.redis.io/releases/redis-6.0.6.tar.gz

3.2 进行解压

tar -zxvf redis-6.0.6.tar.gz

3.3 执行make命令

make

3.4 install并指定目录

make install PREFIX=/www/luke/redis5

3.5 修改profile文件

vi /etc/profile

在最后一行添加:

export REDIS_HOME=/www/luke/redis5 
export PATH=$PATH:$REDIS_HOME/bin

保存后,刷新配置文件

source /etc/profile

3.6 执行install server命令

./install_server.sh

输入端口或默认,输出如下:

Selected config: 
Port : 6379 
Config file : /etc/redis/6379.conf 
Log file : /var/log/redis_6379.log 
Data dir : /var/lib/redis/6379 
Executable : /www/luke/redis5/bin/redis-server 
Cli Executable : /www/luke/redis5/bin/redis-cli 
Is this ok? Then press ENTER to go on or Ctrl-C to abort. 
Copied /tmp/6379.conf => /etc/init.d/redis_6379

3 使用

3.1 String

3.1.1 set & get

设定指定key的值和取出指定key的值

127.0.0.1:6379> set k1 hello 
OK 
127.0.0.1:6379> get k1
"hello"

3.1.2 set k1 bye nx

nx意思为当不存在的时候设值,若存在,则不做任何操作

127.0.0.1:6379> set k1 bye nx 
(nil) 
127.0.0.1:6379> get k1 
"hello"

3.1.3 set k2 hello xx

xx的意思是,当k2存在的时候进行修改,不存在则不做任何操作

127.0.0.1:6379> set k2 hello xx 
(nil) 
127.0.0.1:6379> get k2 
(nil)

3.1.4 mset

多重插入,一次性插入多个值

127.0.0.1:6379> mset k3 a k4 b 
OK 
127.0.0.1:6379> get k3 
"a" 
127.0.0.1:6379> get k4 
"b"

原子性操作:

MSETNX设置值的时候,当k2值已经存在设置失败的时候,同一个命令中的k3也不会设置

127.0.0.1:6379> MSETNX k1 a k2 b 
(integer) 1 
127.0.0.1:6379> mget k1 k2 
1) "a" 
2) "b" 
127.0.0.1:6379> MSETNX k2 c k3 d 
(integer) 0 
127.0.0.1:6379> mget k1 k2 k3 
1) "a" 
2) "b" 
3) (nil)

3.1.5 mget

多重取值,一次性取出多个值

127.0.0.1:6379> mget k3 k4 
1) "a" 
2) "b"

3.1.6 append

在原本值的基础上继续添加字符串

127.0.0.1:6379> get k1 "hello" 
127.0.0.1:6379> append k1 " world" 
(integer) 11 
127.0.0.1:6379> get k1 
"hello world"

3.1.7 GETRANGE

取出指定key在指定位置的字符

127.0.0.1:6379> GETRANGE k1 6 10 
"world"

3.1.8 SETRANGE

设定指定key指定位置的字符

127.0.0.1:6379> SETRANGE k1 6 lukeeeee 
(integer) 14 
127.0.0.1:6379> get k1 
"hello lukeeeee"

3.1.9 STRLEN

输出指定key的value的字符串长度

127.0.0.1:6379> STRLEN k1 
(integer) 14

3.1.10 type

输出指定key的value的字符串类型

127.0.0.1:6379> type k1 
string

3.1.11 INCR

对指定key的value自增加一,此时需要value为int类型

127.0.0.1:6379> INCR k1 
(integer) 100 
127.0.0.1:6379> get k1 
"100"

3.1.12 INCRBY

增加指定的值,也需要value为int类型

127.0.0.1:6379> INCRBY k1 22 
(integer) 122

3.1.13 DECR

递减1

127.0.0.1:6379> DECR k1 
(integer) 121 
127.0.0.1:6379> DECRBY k1 2 
(integer) 119

3.1.14 INCRBYFLOAT

增加小数

127.0.0.1:6379> INCRBYFLOAT k1 0.5 
"119.5"

3.1.15 GETSET

拿出后设定值

127.0.0.1:6379> set k1 hello 
OK 
127.0.0.1:6379> GETSET k1 luke "hello" 
127.0.0.1:6379> get k1 
"luke"

3.1.16 setbit

设置二进位的数据只能为0或者1

#将k1的第一个字节的8个二进制位的第2个值设置为1,即为 01000000 
127.0.0.1:6379> setbit k1 1 1 
(integer) 0 
127.0.0.1:6379> STRLEN k1 
(integer) 1 
127.0.0.1:6379> get k1 
"@"

3.1.17 BITCOUNT

计算起始位置到结束位置的1出现过几次

127.0.0.1:6379> BITCOUNT k1 0 -1 
(integer) 1

3.1.18 BITPOS

查找字符串中第一个设置为1或0的bit位。

127.0.0.1:6379> BITPOS k1 1 0 -1 
(integer) 1

3.1.19 bitop

进行运算,逻辑与运算,逻辑或运算

127.0.0.1:6379> SETBIT k1 1 1 
(integer) 0 
127.0.0.1:6379> SETBIT k1 7 1 
(integer) 0 
127.0.0.1:6379> get k1 
"A" 
127.0.0.1:6379> SETBIT k2 1 1 
(integer) 0 
127.0.0.1:6379> SETBIT k2 6 1 
(integer) 0 
127.0.0.1:6379> get k2 
"B" 
//进行逻辑与运算
127.0.0.1:6379> BITOP and andkey k1 k2 
(integer) 1 
127.0.0.1:6379> get andkey 
"@" 
//进行逻辑或运算
127.0.0.1:6379> BITOP or orkey k1 k2 
(integer) 1 
127.0.0.1:6379> get orkey 
"C"

3.2 List

list是一个双向链表

3.2.1 lpush & LPOP

当lpush从左侧添加值 lpush k1 a b c d e f命令执行完毕之后再内存中存储的是f e d c b a
LPOP从左侧取出值,则第一个为f

127.0.0.1:6379> lpush k1 a b c d e f 
(integer) 6 
127.0.0.1:6379> LRANGE k1 0 -1 
1) "f" 
2) "e" 
3) "d" 
4) "c" 
5) "b" 
6) "a" 
127.0.0.1:6379> LPOP k1 
"f"

3.2.2 RPUSH & RPOP

rpush从右侧添加值 RPUSH k2 a b c d e f命令执行完毕之后再内存中存储的是a b c d e f
RPOP从右侧取出值,则第一个为f

127.0.0.1:6379> RPUSH k2 a b c d e f 
(integer) 6 
127.0.0.1:6379> LRANGE k2 0 -1 
1) "a" 
2) "b" 
3) "c" 
4) "d" 
5) "e" 
6) "f" 
127.0.0.1:6379> RPOP k2 
"f"

3.2.3 LINDEX

给出索引,可以取出对应元素

127.0.0.1:6379> LINDEX k1 2 
"d"

3.2.4 LSET

给出索引,设定对应元素的值

127.0.0.1:6379> LSET k1 2 x 
OK 
127.0.0.1:6379> LRANGE k1 0 -1 
1) "f" 
2) "e" 
3) "x" 
4) "c" 
5) "b" 
6) "a"

3.2.5 LREM

LREM k3 2 a从左到右移除 k3 的2 个a
LREM k3 -2 a从右到左移除 k3 的2 个a
LREM k3 0 a移除所有的a

127.0.0.1:6379> LPUSH k3 a 3 4 d a f 4 q a f r 
(integer) 11 
127.0.0.1:6379> LRANGE k3 0 -1 
1) "r" 
2) "f" 
3) "a" 
4) "q" 
5) "4" 
6) "f" 
7) "a" 
8) "d" 
9) "4" 
10) "3" 
11) "a" 
127.0.0.1:6379> LREM k3 2 a 
(integer) 2 
127.0.0.1:6379> LRANGE k3 0 -1 
1) "r" 
2) "f" 
3) "q" 
4) "4" 
5) "f" 
6) "d" 
7) "4" 
8) "3" 
9) "a"

3.2.6 LINSERT

LINSERT k1 before x xxxxx 在从左往右第一个元素x的前边插入xxxx

127.0.0.1:6379> LRANGE k1 0 -1 
1) "f" 
2) "e" 
3) "x" 
4) "c" 
5) "b" 
6) "a" 
127.0.0.1:6379> LINSERT k1 before x xxxxx 
(integer) 7 
127.0.0.1:6379> LRANGE k1 0 -1 
1) "f" 
2) "e" 
3) "xxxxx" 
4) "x" 
5) "c" 
6) "b" 
7) "a"

3.2.7 LLEN

统计目标key中共有多少元素

127.0.0.1:6379> LLEN k3 
(integer) 9

3.2.8 BLPOP

若是k1里边没有值则阻塞等待,有值的时候取出, 0 为时间设置,0表示无限时间

127.0.0.1:6379> BLPOP k1 0

3.2.9 LTRIM

移除给定范围之外的数据

127.0.0.1:6379> LPUSH k1 a b c d e f g 
(integer) 7 
127.0.0.1:6379> LTRIM k1 1 3 
OK 
127.0.0.1:6379> LRANGE k1 0 -1 
1) "f" 
2) "e" 
3) "d"

3.3 Hash

3.3.1 HSET & HMSET

127.0.0.1:6379> HSET luke name luke 
(integer) 1 
127.0.0.1:6379> HMSET luke age 18 addr xian 
OK

3.3.2 HGET & HMGET

设定值

127.0.0.1:6379> HGET luke age 
"18"
127.0.0.1:6379> HMGET luke age name 
1) "18" 
2) "luke"

3.3.3 HKEYS

返回所有的key

127.0.0.1:6379> HKEYS luke 
1) "name" 
2) "age" 
3) "addr"

3.3.4 HVALS

返回所有的value

127.0.0.1:6379> HVALS luke 
1) "luke" 
2) "18" 
3) "xian"

3.3.5 HGETALL

返回目标key里的所有值

127.0.0.1:6379> HGETALL luke 
1) "name" 
2) "luke" 
3) "age" 
4) "18" 
5) "addr" 
6) "xian"

3.3.6 HINCRBYFLOAT

增加目标值

127.0.0.1:6379> HINCRBYFLOAT luke age 0.5 
"18.5" 
127.0.0.1:6379> HGET luke age 
"18.5"

3.3.7 HINCRBYFLOAT -1

负数表示减少目标值

127.0.0.1:6379> HINCRBYFLOAT luke age -1 
"17.5" 
127.0.0.1:6379> HGET luke age 
"17.5"

3.4 Set

set特点无序去重

3.4.1 SADD

增加值到目标key

127.0.0.1:6379> SADD name luke aa bb cc aa 
(integer) 4 
127.0.0.1:6379> SMEMBERS name 
1) "bb" 
2) "aa" 
3) "cc" 
4) "luke"

3.4.2 SREM

从目标key移除一个指定的值

127.0.0.1:6379> SREM name luke 
(integer) 1 
127.0.0.1:6379> SMEMBERS name 
1) "cc" 
2) "bb" 
3) "aa"

3.4.3 SINTER

求交集

127.0.0.1:6379> SADD k1 1 2 3 4 5 
(integer) 5 
127.0.0.1:6379> SADD k2 4 5 6 7 8 
(integer) 5 
127.0.0.1:6379> SINTER k1 k2 
1) "4" 
2) "5"

3.4.4 SINTERSTORE

求交集并存入k3

127.0.0.1:6379> SADD k1 1 2 3 4 5 
(integer) 5 
127.0.0.1:6379> SADD k2 4 5 6 7 8 
(integer) 5 
127.0.0.1:6379> SINTERSTORE k3 k1 k2 
(integer) 2 
127.0.0.1:6379> SMEMBERS k3 
1) "4" 
2) "5"

3.4.5 SUNION

求并集

127.0.0.1:6379> SUNION k1 k2 
1) "1" 
2) "2" 
3) "3" 
4) "4" 
5) "5" 
6) "6" 
7) "7" 
8) "8"

3.4.6 SUNIONSTORE

求并集并且存入k4

127.0.0.1:6379> SUNIONSTORE k4 k1 k2 
(integer) 8 
127.0.0.1:6379> SMEMBERS k4 
1) "1" 
2) "2" 
3) "3" 
4) "4" 
5) "5" 
6) "6" 
7) "7" 
8) "8"

3.4.7 SDIFF

求差集,包含在k1并且不在k2的值

//包含在k1并且不在k2的值
127.0.0.1:6379> SDIFF k1 k2 
1) "1" 
2) "2" 
3) "3" 
//包含在k2并且不在k1的值
127.0.0.1:6379> SDIFF k2 k1 
1) "6" 
2) "7" 
3) "8"

3.4.8 SRANDMEMBER

随机取出不重复的5个值

127.0.0.1:6379> SADD k1 aa bb cc dd ee ff ii gg hh 
(integer) 9 
127.0.0.1:6379> SRANDMEMBER k1 5 
1) "dd" 
2) "aa" 
3) "ff" 
4) "bb" 
5) "ee"

随机取出不重复的10个值,set中值一共9个,则返回9个值

127.0.0.1:6379> SRANDMEMBER k1 10 
1) "ii" 
2) "bb" 
3) "gg" 
4) "ee" 
5) "dd" 
6) "ff" 
7) "aa" 
8) "cc"
9) "hh"

随机取出5个值,可以重复

127.0.0.1:6379> SRANDMEMBER k1 -5 
1) "gg" 
2) "bb" 
3) "bb" 
4) "ee" 
5) "gg"

随机取出10个值,可以重复,当值不够10个的时候,会重复,但一定是10个

127.0.0.1:6379> SRANDMEMBER k1 -10 
1) "aa" 
2) "bb" 
3) "ee" 
4) "bb" 
5) "ff" 
6) "dd" 
7) "cc" 
8) "gg" 
9) "ff" 
10) "bb"

为0,不返回

127.0.0.1:6379> SRANDMEMBER k1 0 
(empty list or set)

3.4.8 SPOP

取出一个值并在set队列中删除此值

127.0.0.1:6379> SPOP k1 
"dd" 
127.0.0.1:6379> SPOP k1 
"ii" 
127.0.0.1:6379> SPOP k1 
"ee" 
127.0.0.1:6379> SPOP k1 
"hh" 
127.0.0.1:6379> SPOP k1 
"ff" 
127.0.0.1:6379> SPOP k1 
(nil)

3.5 sorted set

也可以称之为zset,它的value有三个维度:

  • 正负向索引
  • score

3.5.1 ZADD

插入数据时需要设定score的值,存入后默认按照score的值从小到大进行排序。

127.0.0.1:6379> ZADD k1 8 aa 2 bb 3 cc
(integer) 3
127.0.0.1:6379> ZRANGE k1 0 -1
1) "bb"
2) "cc"
3) "aa"

查询的时候也可以在命令后边加withscores进行带分值查询

127.0.0.1:6379> ZRANGE k1 0 -1 withscores
1) "bb"
2) "2"
3) "cc"
4) "3"
5) "aa"
6) "8"

按照分值取值,3为最小值,8为最大值。

127.0.0.1:6379> ZRANGEBYSCORE k1 3 8
1) "cc"
2) "aa"

3.5.2 ZREVRANGE

按照索引倒序取值,即取出的是分值最高的前两名

127.0.0.1:6379> ZREVRANGE k1 0 1
1) "aa"
2) "cc"

3.5.3 ZSCORE

查询分值

127.0.0.1:6379> ZSCORE k1 aa
"8"

3.5.4 ZRANK

查询索引,也就是查询排序

127.0.0.1:6379> ZRANK k1 aa
(integer) 2

3.5.5 ZINCRBY

对分数进行加减操作

127.0.0.1:6379> ZRANGE k1 0 -1 withscores
1) "bb"
2) "2"
3) "cc"
4) "3"
5) "aa"
6) "8"
127.0.0.1:6379> ZINCRBY k1 2.5 bb
"4.5"
127.0.0.1:6379> ZRANGE k1 0 -1 withscores
1) "cc"
2) "3"
3) "bb"
4) "4.5"
5) "aa"
6) "8"