Redis相关知识点

标签: Redis 分类: 后台服务 创建时间:2019-12-10 02:04:48 更新时间:2024-11-15 10:49:43

先前写过一篇使用spring boot连接redis的文章(Spring-Boot中Redis使用),现在又要使用nodejs连接redis,所以干脆把redis知识点单独列出来吧。Redis作为一门专门的技术来说,其实还是在面试的时候有很多问题可以问的。

1.linux安装Redis

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
## 安装,安装之后就自动启动了
$ sudo apt-get update
$ sudo apt-get install redis-server
## 启动
$ redis-server
## 查看是否启动
$ redis-cli

## Centos安装

# 添加源(如果yum不能安装redis的话)
yum install epel-release

sudo yum -y install redis
## 启动
sudo systemctl start redis
## 进入命令行
redis-cli

## 设置远程访问
vim /etc/redis/redis.conf

## 找到bind这一行,去掉#注释并改为:
bind 0.0.0.0
## 重启redis

2.nodejs redis设置过期时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const redis = require("redis");
const redisConfig = {
host: "填你redis服务所在的ip",
port: "端口号"
};
const __createClient = () => {
const client = redis.createClient(redisConfig.port, redisConfig.host);
//记录redis错误
client.on("error", function (err) {
logger("redis error: " + err);
});
return client;
};

const client = __createClient();
client.expire("你要设置的key", "你要设置的时间", (err, isSuccess) => {
client.quit();
if (err || !isSuccess) {
//your code
} else {
//your another code
}
});

3.设置过期时间

主要涉及两个方法:

1
2
3
4

void set(K key, V value, long timeout, TimeUnit unit); 这个api才是过期时间,
void set(K key, V value, long offset); 这个api是设置从头开始 偏移多少位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 设置指定key 多少秒后过期, seconds 为 -1 时表示永不过期
expire key seconds
## 查看指定key还有多少秒过期
ttl key
## 移除指定key的过期时间
persist key
## 设置指定key的过期时间为给定的unix时间戳
expireat key timestamp
## 同 ttl命令类似,区别在于 ttl是返回还有多少秒过期,而 pttl是返回多少毫秒
pttl key
## 设置 指定key的过期时间,时间是毫秒级别
pexpire key milliseconds
## 同 expireat命令类似,区别在于时间级别为毫秒
pexpireat key milliseconds

4.列出所有的key

1
redis-cli keys '*'

5.windows安装Redis

下载redis压缩包,解压就可以直接用,打开解压目录中的redis-server.exe就是启动了redis服务。winsows下官网没有提供,直接下载免安装版,解压之后,双击运行redis-server.exe启动运行服务端就可以了,redis-cli.exe是客户端。

安装为服务

1
.\redis-server.exe --service-install redis.windows.conf

在计算机管理->服务里面,设置启动,并设置开机启动。

注意
最新的版本可以到tporadowski /redis 下载,下载下来msi,直接安装就可以了。

参考文章:
1.windows下安装和配置Redis
2.Windows下安装Redis并设置开机自动启动 (安装为window服务,并设置开机启动)
3. tporadowski /redis 这里的版本好像还在更新,上面的版本已经是2016年的了,现在都是2022年了,好几年不更新了。

6.删除数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## 删除单个
del key

## 删除多个,适用与linux
redis-cli -a pass(密码) keys "WX_ACT_USER_KEY_*" | xargs redis-cli -a pass(密码) del

## 默认的端口操作
redis-cli keys "WxMpSessionKey*" |xargs redis-cli del

## 清空所有库的所有数据
key:flushall

##清空单个库的所有key
flushdb

## 适用于linux和windows的命令,PHEMS为要删除的前缀
eval "local keys = redis.call('keys', ARGV[1]) for i=1,#keys,5000 do redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) end return #keys" 0 'PHEMS*'

使用:eval “redis.call(‘del’, unpack(redis.call(‘keys’,’*’)))” 0 命令,会报错:

参考文章:
1.redis清空数据
2.redis删除单个key和多个key
3.通过redis-cli批量删除多个指定模式的key
4.redis批量删除key (windows适用) (这是一种windows和linux适用的方法,实测:eval “redis.call(‘del’, unpack(redis.call(‘keys’,’*’)))” 0,好像不行)
5.Redis根据通配符批量删除Key

7.存取map、set等操作

问题

(1) class java.lang.Double cannot be cast to class java.lang.String (java.lang.Double and java.lang.String are in module java.base of loader ‘bootstrap’)
根据查询资料已经相关例子,我发现了,如果使用 opsForHash.putAll存储一个Map类型的对象到redis,那么必须是Map<String,String>类型,而不能是例如Map<String,Double>这种类型。

1
2
3
4
5
6
7
8
9
10
11
public boolean set(String key, Map value){
boolean result = false;
try {
redisTemplate.opsForHash().putAll(key,value);
result = true;
} catch (Exception e) {
e.printStackTrace();
logger.error("redis_set_map",e);
}
return result;
}
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。