一起养成写作习惯!这是我参与「掘金日新计划 · 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"