本文讲解在linux环境下对开源项目Redis基础操作的学习,Redis 是一款高性能、基于内存 的开源键值对数据库,数据读写几乎都在内存完成,速度极快;同时支持字符串、哈希、列表、集合等多种数据结构,不只是简单缓存。
一、建立Redis环境
// github中下载最新版本的redis
git clone https://github.com/redis/redis.git
// 编译
make
// 测试
make test
// 安装(可能需要管理员权限)
sudo make install
为了便于使用,新建一个存放redis配置文件的文件夹
mkdir redis_data
cp redis/redis-server redis_data/redis-server
启动redis
bash
// 后台运行
redis-server redis.conf --daemonize yes
// 检测是否启动成功
ps aux | grep redis-server
// 输出结果
// zhou 2116 0.3 0.0 134552 5972 ? Ssl 08:51 0:00 redis-server 127.0.0.1:6379
// zhou 2137 0.0 0.0 6612 2256 pts/0 S+ 08:52 0:00 grep --color=auto redis-server
// ip为127.0.0.1
// 接口为6379
redis数据性质
设置和添加的时候自动创建,没有单独用来创建的指令
数据为空时自动删除
全局指令
// 建立连接
redis-cli
// 检查指定key的数据类型
type key
// 删除指定key
del key
// 打印所有key
keys *
// 删除所有key
flushall
二、Redis支持的数据类型
1.string--单体键值存储
1)基础命令
bash
// 添加数据
127.0.0.1:6379> set student avogado6
// 返回结果
OK
// 获取数据
127.0.0.1:6379> get student
// 返回结果
"avogado6"
// 整形数据加减操作
// +1
127.0.0.1:6379> incr count
(integer) 101
// +10
127.0.0.1:6379> incrby count 10
(integer) 111
// -20
127.0.0.1:6379> decrby count 20
(integer) 91
// setnx key不存在的情况下设置value
127.0.0.1:6379> setnx count 1
(integer) 0
2)应用
对象存储,对象属性字段极少修改时使用
bash
127.0.0.1:6379> set role:10001 '{["name"]:"volt",["sex"]:"male",["age"]:20}'
OK
127.0.0.1:6379> get role:10001
"{[\"name\"]:\"volt\",[\"sex\"]:\"male\",[\"age\"]:20}"
累加器,统计阅读量,执行次数等
bash
127.0.0.1:6379> incr ids
(integer) 1
127.0.0.1:6379> incr ids
(integer) 2
位运算,实现签到功能
bash
// 第一天签到
127.0.0.1:6379> setbit sign:10001:202603 1 1
(integer) 0
// 第二天签到
127.0.0.1:6379> setbit sign:10001:202603 2 1
(integer) 0
// 查询签到次数
127.0.0.1:6379> bitcount sign:10001:202603
(integer) 2
// 查询第二天是否签到
127.0.0.1:6379> getbit sign:10001:202603 2
(integer) 1
2.链表--双向链表有序队列
1)基础命令
bash
// 从队列左侧插入多条数据
127.0.0.1:6379> lpush list volt ash meg
(integer) 3
// 打印所有数据,0为首元素下标,-1为尾元素下标
127.0.0.1:6379> lrange list 0 -1
1) "meg"
2) "ash"
3) "volt"
// 从队列右侧插入多条数据
127.0.0.1:6379> rpush list inaros nekros
(integer) 5
// 再次打印
127.0.0.1:6379> lrange list 0 -1
1) "meg"
2) "ash"
3) "volt"
4) "inaros"
5) "nekros"
// 从队列左侧弹出数据
127.0.0.1:6379> lpop list
"meg"
// 从队列右侧弹出数据
127.0.0.1:6379> rpop list
"nekros"
127.0.0.1:6379> lrange list 0 -1
1) "ash"
2) "volt"
3) "inaros"
// 指定key开始移除n个数据
127.0.0.1:6379> lrem list 1 volt
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "ash"
2) "inaros"
// 清空队列后进入阻塞等待状态,直到(另一个线程插入)队列中有数据
127.0.0.1:6379> lrange list 0 -1
(empty array)
127.0.0.1:6379> brpop list 0
// 另一个线程
127.0.0.1:6379> lpush list excalibur
(integer) 1
// 阻塞线程显示结果 1)队列名 2)数据内容
127.0.0.1:6379> brpop list 0
1) "list"
2) "excalibur"
(92.96s)
2)应用
栈(先进后出)
LPUSH + LPOP 或 RPUSH + RPOP
队列(先进先出)
LPUSH + RPOP 或 RPUSH + LPOP
阻塞队列
LPUSH + BRPOP 或 RPUSH + BLPOP
获取固定窗口记录,每次插入数据后都进行一次裁剪,从左侧数据(最新)开始裁剪5个,保持窗口显示最新的5条数据
bash
127.0.0.1:6379> lpush warframe excalibur
(integer) 1
127.0.0.1:6379> ltrim warframe 0 4
OK
127.0.0.1:6379> lpush warframe volt
(integer) 2
127.0.0.1:6379> ltrim warframe 0 4
OK
127.0.0.1:6379> lpush warframe meg
(integer) 3
127.0.0.1:6379> ltrim warframe 0 4
OK
127.0.0.1:6379> lpush warframe wisp
(integer) 4
127.0.0.1:6379> ltrim warframe 0 4
OK
127.0.0.1:6379> lpush warframe ash
(integer) 5
127.0.0.1:6379> ltrim warframe 0 4
OK
127.0.0.1:6379> lpush warframe nekros
(integer) 6
127.0.0.1:6379> ltrim warframe 0 4
OK
127.0.0.1:6379> lrange warframe 0 -1
1) "nekros"
2) "ash"
3) "wisp"
4) "meg"
5) "volt"
3.hash--对象属性结构化存储
1)基础命令
bash
// 哈希类型,设置多条属性
127.0.0.1:6379> hset volt:10001 name volt age 20 sex male height 175
// 返回结果
OK
// 获取数据
127.0.0.1:6379> hgetall volt:10001
1) "name"
2) "volt"
3) "age"
4) "20"
5) "sex"
6) "male"
7) "height"
8) "175"
// 修改数据 年龄+1
127.0.0.1:6379> HINCRBY volt:10001 age 1
// 返回结果
(integer) 21
// 获取属性个数
127.0.0.1:6379> hlen volt:10001
(integer) 4
// 获取单个属性数据
127.0.0.1:6379> hget volt:10001 age
"21"
// 删除单条属性
127.0.0.1:6379> hdel volt:10001 age
(integer) 1
2)应用
存储对象,对象属性有修改需求
通常与其他结构一起使用
4.set--无序唯一元素容器
1)基础命令
bash
// 向指定集合中插入元素
127.0.0.1:6379> sadd team wisp nekros nidus ivara
(integer) 4
// 统计集合中元素数量
127.0.0.1:6379> scard team
(integer) 4
// 判断元素是否在集合中
127.0.0.1:6379> sismember team volt
(integer) 0
set结构中元素必须唯一
bash
// 重复元素无法插入
127.0.0.1:6379> sadd friends:10001 volt
(integer) 0
// 新元素可以插入
127.0.0.1:6379> sadd friends:10001 inaros
(integer) 1
// 再次打印集合
127.0.0.1:6379> smembers friends:10001
1) "volt"
2) "ash"
3) "meg"
4) "inaros"
2)应用
抽奖
bash
// 添加抽奖用户
127.0.0.1:6379> sadd prizedraw volt excalibur meg wisp ash nidus inaros nekros ivara gauss
(integer) 10
// 抽取三名幸运用户
127.0.0.1:6379> srandmember prizedraw 3
1) "volt"
2) "wisp"
3) "nidus"
共同关注
bash
// 两名用户各自的好友
127.0.0.1:6379> sadd follow:meg wisp ash nidus nekros
(integer) 4
127.0.0.1:6379> sadd follow:volt wisp ash nidus ivara gauss excalibur
(integer) 6
// 取交集
127.0.0.1:6379> sinter follow:meg follow:volt
1) "wisp"
2) "ash"
3) "nidus"
推荐好友,meg可能认识的人
bash
// 取差集
127.0.0.1:6379> sdiff follow:volt follow:meg
1) "ivara"
2) "excalibur"
3) "gauss"
5.zset--带分数排序的唯一集合
1)基础命令
bash
// 插入带有score的元素,分数在元素之前
127.0.0.1:6379> zadd ranks 100 volt 110 ash 120 excalibur 90 meg
(integer) 4
// 打印所有元素及其分数(默认从低到高)
127.0.0.1:6379> zrange ranks 0 -1 withscores
1) "meg"
2) "90"
3) "volt"
4) "100"
5) "ash"
6) "110"
7) "excalibur"
8) "120"
// 获取某个元素的score
127.0.0.1:6379> zscore ranks meg
"90"
// 为集合中元素的score增加值
127.0.0.1:6379> zincrby ranks 10 volt
"110"
2)应用
排行榜,从大到小排序
bash
127.0.0.1:6379> zrevrange ranks 0 -1
1) "excalibur"
2) "ash"
3) "volt"
4) "meg"
延时队列,通过触发时间为事件进行排序