Redis系列一 基本用法&应用场景

来都来了 2020-11-12 16:26:57 ⋅ 874 阅读

 

 

说明

redis的最基本使用方法以及使用场景。

字符串


// string
async function stringFun() {
const [key1, key2, key3, key4, key5] = ["key1", "key2", "key3", "key4", "key5"];
const [v1, v2, v3, v4, v5] = ["v1", "v2", "v3", "v4", "v5"];
// 1. set get
await redis.set(key1, v1);
// 2. 过期时间
await redis.setex(key2, 10, v2);
// 3. 自增
await redis.incr(key3);
// 4. 加减
await redis.incrby(key3, 100);
// 5. 是否存在
const judgeKey4 = await redis.exists(key4);
// 6. value length
const keyLen = await redis.strlen(key1);

const getValue = await redis.get(key1);
const hgetVaule = await redis.mget(key1, key2, key3);
console.log("getValue : ", getValue);
console.log("hgetVaule : ", hgetVaule);
console.log("judgeKey4 : ", judgeKey4);

// 6. 删除
await redis.del(key1, key2, key3, key4);
process.exit(1);
};
 

Hash


/**
* Hash
* 应用场景:
* 1. 【存-取-改】用户信息【ID、name、age..】,无需set\get string 序列化。
* 2. 初始化,缓存用户信息
* 3. 购物车,用户ID:物品ID、数量增减、删除
* 4. 商品的价格、销量、关注数、评价数等可能经常发生变化的属性,就适合存储在hash类型里
*/
async function hashFun() {
const userObj = { id: 1, name: 'zhangsan', age: 18 }
const userKey = 'user_1';
// 1. hset key filed value
await redis.hset(userKey, userObj);
// 2. 所有的key
const hkeys = await redis.hkeys(userKey);
// 3. 整个value
const hgetall = await redis.hgetall(userKey);
console.log('hkeys: ', hkeys)
console.log('hgetall: ', hgetall)
// 4. 更改单个数值
await redis.hset(userKey, 'age', 100);
// 5. 字段加减
await redis.hincrby(userKey, 'age', -90);
const hgetall1 = await redis.hgetall(userKey);
console.log('hgetall--: ', hgetall1)
// 6. hsetnx 如果存在key,则不更新
await redis.hsetnx(userKey, 'name', 'lisi');
// !7. expire 设置过期时间
await redis.expire(userKey, 2);
process.exit(1);
/**

% ts-node base.ts
hkeys: [ 'id', 'name', 'age' ]
hgetall: { id: '1', name: 'zhangsan', age: '18' }
hgetall--: { id: '1', name: 'zhangsan', age: '10' }

*/
}
 

List


/**
* 列表
* 1. list类型是用来存储多个【有序】的字符串的,支持存储【2^32次方-1】个元素。
* 2. 应用场景
* 1. 栈: lpush + lpop
* 2. 队列:lpush + rpop
* 3. 定长队列:lpush + ltrim
* 4. 消息队列:lpush + brpop
*/
async function listFun(){
const bookKey = 'books';
const bookValue = ['C', 'C++', 'Java', 'OC', 'Node'];
// 1. 栈【左进左出】
// C->Node 左:进入队列。
await redis.lpush(bookKey, bookValue);
const llen = await redis.llen(bookKey);
let i = 0;
while(i < llen) {
// 左出
const item = await redis.lpop(bookKey);
console.log('出栈:', item);
i++;
}
console.log('------');
// 2. 左进右出
await redis.lpush(bookKey, bookValue);
const len = await redis.llen(bookKey);
let index = 0;
while(index < len) {
// 左出
const item = await redis.rpop(bookKey);
console.log('出队列-:', item);
index++;
}
console.log('------');
/**
* 3. 固定长度的队列
* 1. 队列结合 ltrim, 【保留起止位置内,删除其他】:start_index和end_index定义了一个区间内的值将被保留下来
*/
await redis.lpush(bookKey, bookValue);
// 保留【前三个】
await redis.ltrim(bookKey, 0, 2);
// 获取【队列全部信息】
const firstThree = await redis.lrange(bookKey, 0, -1);
console.log('队列全部信息', firstThree);
process.exit(1);
}

Set


/**
* 集合
* 1. 定义: 集合类型 (Set) 是一个【无序】并【唯一】的键值集合。
* !2. 场景:【以某个条件为权重】
* 1. 关注的人
* 2. 中奖人
* 3. 例子
*/
async function setFun() {
const [key1, key2, key3, key4, key5] = ["set01", "set02", "set03", "set04", "set05"];
const [v1, v2, v3, v4, v5] = ["v1", "2", "v3", "v4", "v5"];
const [v10, v20, v30, v40, v50] = ["v1", "v2", "v3", "40", "50"];

const setV1 = [v1, v2, v3, v4, v5];
// 1. 添加元素
await redis.sadd(key1, setV1);
await redis.sadd(key2, [1, 2, 3, 4, 5]);
// 2. 获取全部
const allValue = await redis.smembers(key1);
// 3. 是否存在
const sismember = await redis.sismember(key1, 'v1');
// 4. 随机获取几个数据
const srandmember = await redis.srandmember(key1, 2);
// 5. 随机删除几个数据
await redis.spop(key1, 1);
console.log('allvalue: ', allValue);
console.log('sismember: ', sismember);
console.log('srandmember: ', srandmember);
const key1Values = await redis.smembers(key1);
const key2Values = await redis.smembers(key2);
console.log('key1---Values: ', key1Values);
console.log('key2---Values: ', key2Values);

// 6. 将 set1 中的数据 转移到 set2 中: 把set1中的“v1”转移到set2中;
await redis.smove(key1, key2, v10);
// !7. 差集, 以前者为基准
const sdiff = await redis.sdiff(key1, key2);
// 8. 交集,
const sinter = await redis.sinter(key1, key2);
// 9. 并集
const sunion = await redis.sunion(key1, key2);
console.log('sdiff', sdiff)
console.log('sinter', sinter)
console.log('sunion', sunion)
const Vkey1 = await redis.smembers(key1);
const Vkey2 = await redis.smembers(key2);
console.log('key1---Values: ', Vkey1);
console.log('key2---Values: ', Vkey2);

/**
allvalue: [ '2', 'v1', 'v4', 'v5', 'v2', 'v3' ]
sismember: 1
srandmember: [ '2', 'v3' ]
key1---Values: [ '2', 'v1', 'v4', 'v5', 'v3' ]
key2---Values: [ '2', 'v1', '1', '3', '5', '4' ]


sdiff [ 'v5', 'v4', 'v3' ]
sinter [ '2' ]
sunion [ '2', '1', 'v1', '3', 'v4', 'v5', '5', 'v3', '4' ]

key1---Values: [ '2', 'v4', 'v5', 'v3' ]
key2---Values: [ '2', 'v1', '1', '3', '5', '4' ]
*/

// string + set 求交集
await redis.set("book:1:name", "shujujiegou");
await redis.set("book:2:name", "suanfa");
await redis.set("book:3:name", "C");
// set
await redis.sadd("tag:jichu", 1);
await redis.sadd("tag:jichu", 2);
await redis.sadd("tag:yuyan", 3);
// 属于【语言】不属于【基础】
const lang = await redis.sdiff("tag:yuyan", "tag:jichu");
console.log("lang: ", lang);
/**
lang: [ '3' ]
*/
}
 

有序集合

/**
* 有序集合
* 1. 相比于集合类型多了一个排序属性 score(权重),单个存储元素有两个值【元素值、排序值】
* !2. 场景
* 1. 游戏排名
* 2. 微博热点话题
* 3. 学生成绩:汇总、排名、百分制、
*/
async function zsetFun() {
const key = "z:student:math";
const key1 = "z:student:english";
const key2 = 'z:student:sum';

const Ykey = "y:student:math";
// const Ykey1 = "y:student:english";
// const Ykey2 = 'y:student:sum';

// score field score field ...
const value = [90, "zhangsan", 20, "lisi", 99, "xiaoming", 60, "xiaohong"];
const value1 = [30, "zhangsan", 59, "lisi", 80, "xiaoming", 90, "xiaohong"];


const YmathValue = [30, "lucy", 59, "nick", 80, "davi"];


// 1. 添加
await redis.zadd(key, value);
await redis.zadd(key1, value1);
// 默认按score生序排列, 0 -1 获取全部的
const zrange = await redis.zrange(key, 0, -1);
// !分数由高到低,排 优秀的学生, 得逆序写 【100,80】 反之,顺序排,顺序写数字
const zrevrange = await redis.zrevrangebyscore(key, 100, 80);
console.log("zrange", zrange);
console.log("zrevrange", zrevrange);
// 2. 删除, 按score区间、起止、
await redis.zrem(key1, 'xiaming');
await redis.zrem(key2, 'xiaming');
// await redis.zremrangebyscore(key, 10, 60);
// 3. 总个数
const count = await redis.zcard(key);
// 4. 区间内个数
const youxiu = await redis.zcount(key, 80, 100);
// 5. 获取单个field
const zhansan = await redis.zscore(key, "zhangsan");
// 6. 单个fiele 加减
await redis.zincrby(key, 1, "zhangsan")

// 7. 多个集合操作
// ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
// destination 给定的一个新的集合
// numkeys 计算的几个集合
// WEIGHTS 乘法: 默认算法因子 1
// AGGREGATE 默认 sum
// !总成绩,单科相加
await redis.zinterstore(key2, 2, key, key1);
// 全都打印
const total = await redis.zrange(key2, 0, -1, 'WITHSCORES');
console.log(total);
// 8. 某个field排名 从大到小
const xiaoming = await redis.zrevrank(key, "xiaoming");
console.log('xiaoming班级排名', xiaoming);

// !9. 汇总整个年级成绩, 【Y Z 班级数学汇总表】
// !并集
await redis.zadd(Ykey, YmathValue);
// 百分制
const keyClassMath100 = "clas:math:100";
const keyClassMath150 = "clas:math:150";
// 总分
const keyClassMathTotal = "clas:math:total";
// 100 分制 返回元素集合的个数
await redis.zunionstore(keyClassMath100, 2, key1, Ykey);
// 150 分制度
await redis.zunionstore(keyClassMath150, 2, key1, Ykey, 'weights', 1.5, 1.5);
const classMath100 = await redis.zrange(keyClassMath100, 0, -1, 'WITHSCORES');
const classMath150 = await redis.zrange(keyClassMath150, 0, -1, 'WITHSCORES');
console.log("年级数学成绩--100分制", classMath100);
console.log("年级数学成绩--150分制", classMath150);

// 不知道 AGGREGATE 的用处。。。
// await redis.zunionstore(keyClassMathTotal, 2, key1, Ykey, 'AGGREGATE', 'max');
// const classMathTotal = await redis.zrange(keyClassMathTotal, 0, -1, 'WITHSCORES');
// console.log("年级数学成绩", classMathTotal);

// 10.
}
 
 
 
 
 

全部评论: 0

    我有话说:

    Redis系列六 Lua

      本文目标 学习lua基本语法 能够采用redis+lua lua 基本语法 Lua 是种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用

    Redis系列四 锁

      本文目标 1. 熟悉乐观锁ABA概念 2. 理解掌握redis事务以及watch回滚; 3. 实战redis锁 乐观锁 乐观锁是种不会阻塞其他线程并发的机制,它不会使用数据库的

    Redis系列七 Debug Lua

      调试redis+lua 学了lua的基本语法,了解了redis+lua的配套用法,但是却不知道怎么断点调试。学就学全面点, 官网中有dubug相关说明。地址:Redis Lua

    Redis系列八 抢红包

      本文概述 掌握红包的两种常见生成算法 掌握lua+redis 实现原子性抢红包 项目中还有mysql相关内容 了解jmeter的基本用法 遗留问题 redis同步DB时机问题

    Redis面试整理:Redis几种数据类型的用法和应用场景重新梳理了

    1、字符串 1.1 介绍 string 字符串类型是Redis中最为常用和基础的存储类型,是一个由字节组成的序列,他在Redis中是二进制安全的,也可以认为string字符串数据类型能够接收任何格式

    Redis系列二:位图实战,实现打卡签到

    前言 如果要统计篇文章的阅读量,可以直接使用 Redis 的 incr 指令来完成。 如果要求阅读量必须按用户去重,那就可以使用 set 来记录阅读了这篇文章的所有用户 id,获取

    Redis系列九 推荐系统-布隆过滤器

      布隆过滤器 概念 布隆过滤器是种空间利用率较高的概率型数据结构,用来测试一个元素是否在集合中。但是存在一定可能,导致结果误判。当布隆过滤器说某个值存在时,这个值可能不存在;当它说不

    Redis系列四 GEO附近的人

    GEO算法 GeoHash是种地址编码方法。将二维的空间经纬度数据编码成一个字符串; 地球上的经度范围:[-180, 180],纬度范围:[-90,90]。如果以本初子午线、赤道为界,地球可以

    聊分布式场景redis和memcached,及各自经典使用场景和优缺点

    在BAT里,redis已经逐渐取代了memcached,成为分布式场景广泛使用的缓存方案。接下来,我们就分析下,redis是如何取代memcached,成为开发者的宠儿的。

    安全攻防系列 安全基础概念

      该系列记录学习极客时间–安全攻防技能30讲相关内容 安全的本质 安全的本质就是保护数据被合法地使用。 数据:应用最核心的东西;如用户信息、订单信息等等 合法:大到法律法规、业务

    为什么单线程的Redis能够达到百万级的QPS?

    作者:在江湖中coding链接:https://juejin.im/post/5e6097846fb9a07c9f3fe744 性能测试报告 查看了下阿里云 Redis 的性能测试报告如下,能够

    【实战解析】基于HBase的大数据存储在京东的应用场景

    作者就职于京东商城京麦平台组,从事京东商家开放平台的相关开发工作。热爱技术,熟悉各种常用开源框架,有丰富的大型分布式系统、高并发系统的开发经验。热衷于对大数据的研究,对Hadoop、HBase以及

    商城系统 DBShop V3.0 Beta 发布

    全新重构,首次亮相。 系统简介 DBShop企业级商城系统,使用PHP语言基于Laminas(Zendframework 3) + Doctrine 2 组合框架开发完成。可定制、多终端、多场景、多

    BAT大牛Redis客户端与服务端交互原理

    Redis实例运行在单独的进程中,应用系统Redis客户端)通过Redis协议和Redis Server

    Node&RabbitMQ系列四 X场景解构

    目标 先设想购票的场景用户注册成功后,三天内未登陆,则短信提醒。 三段式场景: A-B-C可以延伸至: 发起购票—>时间+未付款—>短信提醒⏰、取消订单 发起退款—>时间+未

    Redisson 3.13.6 发布,官方推荐的 Redis 客户端

    Redisson 3.13.6 已发布,这是一个 Java 编写的 Redis 客户端,具备驻内存数据网格(In-Memory Data Grid)功能,并获得了 Redis 的官方推荐

    MongoDB系列之----概述()

    MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统

    Martian框架发布 3.0.3 版本,Redis分布式锁

    项目简介 Martian 是一个声明式 API 编程(DAP)框架,可以帮助你快速开发后端服务。 以HttpServer作为 http服务,彻底脱离Tomcat这类的Web容器和Servlet

    Redis 5.0.11、6.0.11、6.2 发布,修复 32 位系统上的整数溢出

    Redis 同时发布了 5.0.11、6.0.11 和 6.2 版本。对于使用 32 位 Redis用户来说,此次更新解决了一个重要的安全问题,即 32 位系统上的整数溢出((CVE-2021