Redis
安装
linux上安装
网址 : redis.io
找个文件存放redis.io安装包
命令:
wget http://download.redis.io/releases/redis-5.0.2.tar.gz 下载
tar xzf redis-5.0.2.tar.gz 解压
cd redis-5.0.2/src 进入 redis 文件下src目录
make 编译
注意: 如果你linux上没有 gcc或wget需要下载,gcc是让linux 可以编译源码的编译包
yum install gcc
yum install wget
启动
在redis-5.0.2 目录下
./src/redis-server redis.conf
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-var7zT3u-1664810973004)(https://cdn.jsdelivr.net/gh/leikuan123/images/images/微信截图_20220916134207.png)]
windows上 安装
网址:https://github.com/microsoftarchive/redis
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ni8aJtbn-1664810973007)(https://cdn.jsdelivr.net/gh/leikuan123/images/images/微信截图_20220916134944.png)]
下载 后缀为.zip的文件
并解压
启动
进入cmd模式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8QpMOFJA-1664810973008)(https://cdn.jsdelivr.net/gh/leikuan123/images/images/微信截图_20220916135533.png)]
Redis基本配置
在redis文件下找下 redis.conf 并进入,命令: vi redis.conf
配置项 | 示例 | 说明 |
---|---|---|
daemonize | daemonize yes | 修改位置:136行,是否用后台运行,默认为no |
port | port 6379 | 设置端口号,默认为6379 |
logfile | llogfile ‘redis.log’ | 设置日志文件 |
databases | databases 255 | 设置redis数据库总量 |
dir | dir数据文件目录 | 设置数据文件储存位置 |
requirepass | requirepass 12345 | 设置使用密码 |
设置 redis 后台运行
linux
修改 deamonize 配置项为后台运行,并保存重启 命令: redis-server redis.conf
windows 上暂时不弄,有时间弄
后台查看 报错(netstat not found):
后台查看6379端口是否被占
netstat -tulpn
需要下载 net-tools
yum install net-tools
下载后,重新查看后台,说明已经redis后台运行了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f1h7Ovrl-1664810973009)(https://cdn.jsdelivr.net/gh/leikuan123/images/images/微信截图_20220916151636.png)]
强制关闭redis
kill -9 + redis对应的PID
kill -9 34412
客户端关闭(安全)
关于客户端后面会描述
redis-cli shutdown
设置连接密码
在 redis.conf或redis.windows.conf 中注释 requirepass 那行 ,并且设置密码
连接 redis
auth +密码
Redis客户端(需redis-server run 状态)
在redis文件下启动client
redis-cli
Redis通用命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AqIQFFot-1664810973010)(https://cdn.jsdelivr.net/gh/leikuan123/images/images/微信截图_20220918193506.png)]
Redis数据类型
String - 字符串类型
键 值
String 最大512mb 建议单个kv不超过100kb
字符串命令:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-40bLvAtM-1664810973011)(https://cdn.jsdelivr.net/gh/leikuan123/images/images/微信截图_20220918205444.png)]
Hash - Hash 类型
Hash类型用于存储结构化数据,有点类似 java中的 map
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bZCjQgNf-1664810973012)(https://cdn.jsdelivr.net/gh/leikuan123/images/images/微信截图_20220918210432.png)]
del | del emp:1 | 删除 emp:1 中的所有键 |
---|---|---|
List - 类型
命令 | 示例 | 说明 |
---|---|---|
rpush | rpush list c | 向 list 右边插入 c,可以插入多个 |
lpush | lpush list b | 向 list 左边插入 b,可以插入多个 |
lrange | lrange list 0 -1 | 显示list中的所有键 |
rpop | rpop list | 弹出list中的最右键 |
lpop | lpop list | 弹出 list 中的最左键 |
Set - 类型
Set集合是字符吕的无序集合,集合成员是唯一的
单词 :
intersection 交集
union set 并集
difference set 差集
命令 | 示例 | 说明 |
---|---|---|
sadd | sadd set_test a | 建一个set_test 集合,增加一个键,可以插入多个,根据需求决定 |
smembers | smembers set_test | 查看set_test集合中的所有属性 |
sinter | sinter set_test set_test2 | 查看两个集合交集 属性 |
sunion | sunion set_test set_test2 | 查看两个集合并集 属性 |
sdiff | sdiff set_test set_test2 | 差集有前后顺序,以前面的集合为准,显示的是set_test没有的属性 |
Zset - 有序集合类型
Zset集合是字符串有序集合,集合成员是唯一的
命令 | 示例 | 说明 |
---|---|---|
zadd | zadd zset_test 100 a | |
zrange | zrange zset_test 0 -1 | 显示zset_test所有 |
withscores | zrange zset_test 0 -1 | 显示zset_test所有,并显示分数 |
zrangebyscore | zrangebyscore zset_test 100 1003 | 显示分数为100-103的键 |
连接外部服务器的redis
修改redis.conf
关闭保护模式
protected-mode no -> protected-mode yes
设置可连接的ip
bind 127.0.0.1 -> bind 0.0.0.0
0.0.0.0 表示任何ip 都可以连接
防火墙开放6379端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --reload 重新加载防火墙,使设置生效
解读: firewall-cmd 表示 防火墙命令
zone=public 公共区域的防火墙
–add-port=6379/tcp 增加开放6379端口,允许tcp协议数据传输
permanent 设置永久生效,如果没有加上这一句,重启后之前的就会失效
注意服务器是阿里云,腾讯云等:
如果是外部服务器,如阿里云,腾讯云等,你还要在其安全组开启redis端口,一般默认为6379,(使用命令没有用,头疼,搞了一下午,教训呀)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K9WTrHoC-1664810973014)(https://cdn.jsdelivr.net/gh/leikuan123/images/images/微信截图_20220919190303.png)]
查看服务器ip(分内外网)
内网
如果你是在电脑上搭建的虚拟机,就是属于内网
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aTGMV266-1664810973014)(https://cdn.jsdelivr.net/gh/leikuan123/images/images/微信截图_20220919163139.png)]
外网
因为我这里写文章用的是阿里云服务器,属于外网
所有直接用外网 ip
注意事项:
Java客户端-Jedis
jedis 是java语言开发的redis 客户端工具包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nLR4ruyM-1664810973016)(https://cdn.jsdelivr.net/gh/leikuan123/images/images/微信截图_20220919163724.png)]
进入GitHub - redis/jedis: Redis Java client designed for performance and ease of use.
看了下文档介绍,可以用Maven导入
Maven导入jedis
我这里版本是2.9.0,找到pom.xml粘贴进入就好了
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
java连接jedis
@Test
public void getConnRedis() {
//注意要保持服务器开启redis-server,还分内外网,所有ip不一样,这里使用阿里云服务器,用公网ip
Jedis jedis = new Jedis("公网ip",6379);
try {
jedis.auth("12345");
jedis.select(2);
System.out.println("redis 连接成功!");
}catch (Exception e){
e.printStackTrace();
}finally {
jedis.close();
}
}
java操作redis
String 类型
插入单个
//字符串
jedis.set("sn","2333434");
到服务器上查看
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zFmlkult-1664810973017)(https://cdn.jsdelivr.net/gh/leikuan123/images/images/微信截图_20220919191411.png)]
说明已经成功插入!
插入多个
jedis.mset(new String[]{"name","jjk","age","18"});
Hash 类型
单个
//设置单个键为student1 属性为 name,值 为lili
jedis.hset("student1","name","lili");
多个
Map<String, String> map= new HashMap<>();
map.put("name","lili");
map.put("age","38");
map.put("sex","男");
jedis.hmset("student2",map);
//取出
Map<String, String> student2 = jedis.hgetAll("student2");
List类型
可以出现重复数据
//List
jedis.rpush("letter",new String[]{"d","e","f","g"});
jedis.lpush("letter",new String[]{"c","b","a"});
List<String> letter = jedis.lrange("letter", 0, -1);
jedis.lpop("letter");
jedis.rpop ("letter");
System.out.println(letter);
Jedis缓存数据
创建一个物品类
public class Goods {
private int goodId;
private String goodName;
private long price;
public Goods() {
}
public Goods(int goodId, String goodName, long price) {
this.goodId = goodId;
this.goodName = goodName;
this.price = price;
}
public int getGoodId() {
return goodId;
}
public void setGoodId(int goodId) {
this.goodId = goodId;
}
public String getGoodName() {
return goodName;
}
public void setGoodName(String goodName) {
this.goodName = goodName;
}
public long getPrice() {
return price;
}
public void setPrice(long price) {
this.price = price;
}
@Override
public String toString() {
return "Goods{" +
"goodId=" + goodId +
", goodName='" + goodName + '\'' +
", price=" + price +
'}';
}
}
类转成json字符串
网址:GitHub - 阿里巴巴/快速约翰逊:一个快速的JSON解析器/生成器。
导入Maven项目中的pom.xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
代码
@Test
public void GoodsTest() {
Jedis jedis = new Jedis("47.100.227.189", 6379);
try {
List<Goods> goodsArrayList = new ArrayList<>();
goodsArrayList.add(new Goods(6696, "苹果", 5));
goodsArrayList.add(new Goods(3493, "橘子", 7));
goodsArrayList.add(new Goods(8990, "香蕉", 9));
jedis.auth("12345");
jedis.select(3);
for (Goods g:goodsArrayList
) {
//对象转成json格式的字符串
String json = JSON.toJSONString(g);
System.out.println(json);
String key = "goods"+g.getGoodId();
jedis.set(key,json);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.close();
}
}
json字符串转成对应的类
代码:
@Test
public void jsonToClass(){
Jedis jedis = new Jedis("47.100.227.189", 6379);
try {
jedis.auth("12345");
jedis.select(3);
String goodId = "goods"+"6696";
Goods goods = JSON.parseObject(g, Goods.class);
System.out.println(goods);
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.close();
}
}
jedis.close();
}
}
#### json字符串转成对应的类
##### 代码:
@Test
public void jsonToClass(){
Jedis jedis = new Jedis(“47.100.227.189”, 6379);
try {
jedis.auth(“12345”);
jedis.select(3);
String goodId = “goods”+“6696”;
Goods goods = JSON.parseObject(g, Goods.class);
System.out.println(goods);
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.close();
}
}