文章摘要
Redis是什么?
Redis是Key-Value型NoSQL数据库。
Redis将数据保存在内存中,同时也能持久化到磁盘上。
Redis常用于缓存,利用内存的高效提高程序的处理速度。
Redis的特点?
1.速度快
2.广泛的语言支持
3.持久化
4.多数据结果
5.主从复制
6.分布式与高可用
Redis的安装与启动
Linux系统的安装
下载,解压,编译:
$ wget http://download.redis.io/releases/redis-5.0.4.tar.gz
$ tar xzf redis-5.0.4.tar.gz
$ cd redis-5.0.4
$ make
Linux运行:./src/redis-server redis.conf
Windows运行:redis-server redis.windows.conf
Redis的常用基本配置
启动:在redis-4.0.14目录下 输入命令 ./src/redis-server redis.conf
启动Redis (ctrl+c是退出)
关闭:利用redis客户端 关闭=> ./src/redis.cli shutdown
vim redis.conf 进入redis配置文件,可以配置。
redis.conf 文件配置项 | 配置示例 | 说明 |
---|---|---|
daemonize | daemonize yes | 是否启用后台运行,默认no |
port | port 6379 | 设置端口号,默认6379 |
logfile | logfile 日志文件 | 设置日志文件 |
databases | databases 255 | 设置redis数据库总量 |
dir | dir 数据文件目录 | 设置数据文件存储目录 |
requirepass | 设置密码 | 输入密码格式:auth 密码 |
redis-cli
文件是Redis的客户端
[root@Red764 redis-5.0.4]# ./src/redis-cli [若端口改了就要:-p 端口号] (进入客户端)
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit (退出客户端)
[root@Red764 redis-5.0.4]#
Redis的通用命令
进入客户端后,就可以输入类似SQL语句那样的命令了。👇👇👇
命令 | 示例 | 说明 |
---|---|---|
select | select 0 | 选择 0 号数据库 |
set | set name MJ | 设置key=name ,value=MJ |
get | get hello | 获取key = hello 结果 |
keys | keys he* | 根据 Pattern表达式 查询符合条件的Key |
dbsize | dbsize | 返回 key 的总数 |
exists | exists a | 检查key = a 的数据 |
del | del a | 删除 key= a 的数据 |
expire | expire hello 20 | 设置key=hello 20秒后过期 |
ttl | ttl hello | key=hello 还有多少时间过期 |
Redis数据类型
String - 字符串类型
String最大512mb,建议单个kv不超过100kb
Hash - Hash类型
用于存储结构化数据
List - 列表类型
查看列表里的元素:lrange
[列表名] [开始] [结束]
Set - 集合类型 和 Zset - 有序集合类型
略…
Java 中使用 Redis
Jedis
jedis 是 java 语言开发的 => Redis 客户端 工具包。jedis只是对Redis命令的封装。
案例🔧🔧🔧: win10 远程 使用Redis
1. 因为Redis的机制只允许本机进行通信访问,远程访问需要修改两个参数:
进入:vim redis.conf
找到88行 => rotected-mode yes(只允许指定的ip才能访问),改成 no
69行 => bind 12x.x.x.x 改成 => bind 0.0.0.0(四个0代表所有ip都能访问进来)
2. 设置防火墙,把Redis的端口号放行出来。
3. 查找jedis客户端。maven仓库有,直接Maven官网搜索:jedis 会出来=> redis.clients
4. 创建工程,加载 jedis依赖。然后就可以用Java使用jedis了。
public class JedisTestor {
public static void main(String[] args) {
//创建jedis(客户端)对象,并且连接到Redis服务器
Jedis jedis = new Jedis("连接ip地址",6379);
try {
//如果Redis中设置了密码,就要输入密码
//jedis.auth("xxx");
//检测一下 例如:换成2号数据库
jedis.select(2);
System.out.println("Redis连接成功");
}catch (Exception e){
e.printStackTrace();
}finally {
//关闭连接
jedis.close();
}
}
} 控制台输出 ===》》》Redis连接成功
=================================String类型操作==============================
public class JedisTestor {
public static void main(String[] args) {
Jedis jedis = new Jedis("连接ip地址",6379);
jedis.select(2);
//字符串
jedis.set("sn","8888-999");
String sn = jedis.get("sn");
System.out.println(sn); ===》》》 8888-999
jedis.mset(new String[]{"key1","value1","key2","value2"});
List<String> mget = jedis.mget(new String[]{"sn", "key1", "key2"});
System.out.println(mget); ===》》》 [8888-999, value1, value2]
jedis.close();
}
}
=================================Hash类型==============================
public class JedisTestor {
public static void main(String[] args) {
Jedis jedis = new Jedis("连接ip地址",6379);
jedis.select(2);
//Hash
jedis.hset("emp:1","name","迈克");
String name = jedis.hget("emp:1", "name");
System.out.println(name); ===》》》 麦克
Map map = new HashMap();
map.put("name","杰克");
map.put("age","12");
map.put("id","007");
jedis.hmset("emp:1",map);
Map<String, String> map1 = jedis.hgetAll("emp:1");
System.out.println(map1); ===》》》 {name=杰克, age=12, id=007}
jedis.close();
}
}
=================================List类型==============================
public class JedisTestor {
public static void main(String[] args) {
Jedis jedis = new Jedis("连接ip地址",6379);
jedis.select(2);
//List
jedis.del("sample");
jedis.rpush("sample",new String[]{"a","b","c",});
jedis.lpush("sample",new String[]{"d","e","f",});
List<String> sample = jedis.lrange("sample", 0, -1);
System.out.println(sample); ===》》》 [f, e, d, a, b, c]
jedis.lpop("sample");
jedis.rpop("sample");
//输出台 会输出瞬时的结果,看不到变更的 所有需要重新加载一边
sample = jedis.lrange("sample", 0, -1);
System.out.println(sample); ===》》》 {name=杰克, a
jedis.close();[e, d, a, b]
}
}
利用jedis缓存数据
创建一个Goods实体类,用来模拟从数据库查询的数据。此处省略,下面将直接使用。
将数据缓存到redis
public class CacheSample {
//模拟数据库查询出来的数据
public CacheSample(){
Jedis jedis = new Jedis("连接ip地址",6379);
try {
List<Goods> goodsList = new ArrayList<Goods>();
goodsList.add(new Goods(7,"电脑","好看的电脑",1888F));
goodsList.add(new Goods(8,"电脑1","好看的电脑1",1988F));
goodsList.add(new Goods(9,"电脑2","好看的电脑2",2088F));
jedis.select(3);
for (Goods goods : goodsList){
//使用了 fatsjosn 序列化字符串 (需要加入依赖)
String json = JSON.toJSONString(goods);
System.out.println(json);
String key = "goods"+goods.getGoogsId();
jedis.set(key,json);
}
}catch (Exception e){
e.printStackTrace();
}finally {
jedis.close();
}
}
public static void main(String[] args) {
new CacheSample();
}
}
============================控制台输出========================================
{"description":"好看的电脑","goodsName":"电脑","googsId":7,"price":1888.0}
{"description":"好看的电脑1","goodsName":"电脑1","googsId":8,"price":1988.0}
{"description":"好看的电脑2","goodsName":"电脑2","googsId":9,"price":2088.0}
============================Redis客户端输出========================================
1xx.x.x.x:6379[3]> keys *
1) "goods7"
2) "goods9"
3) "goods8"
1xx.x.x.x:6379[3]> get goods7 goods7 是key 一大段json字符串是Value
"{\"description\":\"\xe5\xa5\xbd\xe7\x9c\x8b\xe7\x9a\x84\xe7\x94\xb5\xe8\x84\x91\",\"goodsName\":\"\xe7\x94\xb5\xe8\x84\x91\",\"googsId\":7,\"price\":1888.0}"
1xx.x.x.x:6379[3]>
提取redis的缓存数据
沿用上面的例子,从上面Redis缓存中 提取数据
在main方法中继续往下写:
public static void main(String[] args) {
new CacheSample();
//开始提取缓存的数据
System.out.println("请输入要查询的商品编号:");
String next = new Scanner(System.in).next();
Jedis jedis = new Jedis("连接ip地址",6379);
try {
jedis.select(3);
String key = "goods" + next;
if (jedis.exists(key)){
String json = jedis.get(key);
System.out.println(json);
//转回java对象
Goods goods = JSON.parseObject(json, Goods.class);
System.out.println(goods.getGoodsName());
System.out.println(goods.getPrice());
}else {
System.out.println("商品不存在");
}
}catch (Exception e){
e.printStackTrace();
}finally {
jedis.close();
}
}
============================控制台输出========================================
{"description":"好看的电脑","goodsName":"电脑","googsId":7,"price":1888.0}
{"description":"好看的电脑1","goodsName":"电脑1","googsId":8,"price":1988.0}
{"description":"好看的电脑2","goodsName":"电脑2","googsId":9,"price":2088.0} (这三条是上面案例将数据缓存到Redis里的)
请输入要查询的商品编号:
7
{"description":"好看的电脑","goodsName":"电脑","googsId":7,"price":1888.0}
电脑
1888.0