Redis 入门
课程介绍:Redis介绍与安装
掌握Redis的常用命令与数据类型
掌握在Java中操作Redis
1、Redis是Key-Value型NoSQL数据库
2、Redis将数据存储到内存中,同时也能持久化到磁盘
3、Redis常用于缓存,利用内存的高效程序的处理速度
Redis的特点
1、速度快 2、广泛的语言支持
3、持久化 4、多种数据结构
5、主从复制 6、分布式与高可用
Redis的安装
1、Linux系统中安装Redis
2、在Windows系统中安装Redis
1-- 在Linux系统中安装Redis
在浏览器页面输入:redis.io 回车
在下面点击 Download it
2、进入linux系统:cd /usr/local
mkdir redis
cd redis
yum install gcc #下载gcc编译器
下载wget 文件下载工具
yum install wget
输入:wget http://download.redis.io/releases/redis-5.0.5.tar.gz
解压缩文件 tar -xzvf redis-5.0.5.tar.gz
进入文件:cd redis-5.0.5
编译:make #编译源代码
开启服务: ./src/redis-server redis.conf
Windows下的安装
在浏览器页面输入: github.com/MicrosoftArchive/redis
在下面的Redis on Windows 内容下点击release page
下载Redis-x64-3.2.100.zip
解压:在解压目录下打开shell
输入:redis-server redis.windows.conf
Redis的常用基本配置
配置项 示例 说明
daemonize deamonize yes 是否启用后台运行
port port 6379 设置端口号,默认6379
logfile logfile 日志文件 设置日志文件
databases databases 255 设置redis数据库总量
dir dir数据文件目录 设置数据文件存储目录
requirepass requirepass 12345 设置使用密码
在redis的目录下,用vim编辑器打开redis.conf
然后定位在136行,然后按i进入编辑模式,将deamonize 的参数改为yes
esc键,输入wq
然后重新运行: ./src/redis-server redis.conf
输出三行文字,表示后台运行成功
如何关闭redis的进程呢?
使用 kill -9 进程编号 即可杀死进程
但是这样直接杀死进程显得太过于粗暴,可以使用Redis的命令关闭程序
启动客户端: ./src/redis-cli
然后会出现:127.0.0.1:6379>ping
如果出现:PONG
则代表成功启动
输入:exit 则退出当前命令行
利用redis客户端关闭程序
输入: ./src/redis-cli -p 端口号 shutdown
则安全的关闭程序。
vim redis.conf 编辑配置文件,将光标定位到92行
将端口号修改一下,不使用默认的端口号,例如:6380
然后ESC 将光标重新定位到171行,logfile “”
将字符串内的文字修改为:“redis.log”
意思是设置日志文件。
然后启动redis软件
./src/redis-server redis.conf 启动程序,但是程序启动的信息
被输出到了日志信息中
启动客户端: ./src/redis-cli -p 6380 (这是刚刚在配置文件中设置的端口号)
启动后可以输入: ping作为测试:输出PONG代表正常
输入select index(数字) 选择使用哪个编号的数据库
例如:select 0
select 15 …(redis中的数据名字是数字,索引从0开始,默认16个)
超过16个就会产生越界错误
如果觉得数据库总数不够,可以在配置文件中设置
exit退出
vim redis.conf -->找到186行,设置databases:255(最大255个)
:wq保存退出
redis设置密码
vim redis.conf
找到507行,有一个被注释的行,requirepass foobared
可以放开,设置密码,把foobared内容去掉,重新设置密码并保存退出
然后重新的关闭客户端: ./src/redis-cli -p 6380 shutdown
重新启动: ./src/redis-server redis.conf
输入: ./scr/redis-cli -p 6380
之后进行登陆:auth 密码内容
系统输出ok则表示成功!
在redis.conf的文件中的263行中,dir ./(用与指定数据文件的保存路径)
默认是当前文件夹。
Redis通用命令
命令 示例 说明
select select 0 选择0号数据库
set set name lily 设置key=name,value=lily
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 20s后过期
ttl ttl hello 查看key=a的过期剩余时间
Redis数据类型(5种)
一、String -字符串类型
二、Hash -Hash类型
三、List -列表类型(数组)
四、Set -集合类型
五、Zset -有序集合类型
String 字符串类型
(不单单是字符串,包括数字)
键 值
name Lily
counter 3321(对应数字)
sn 7361-7749
String最大512mb,建议单个kv不超过100kb
字符串命令
命令 示例 说明
get get hello 获得key=hello的结果
set set hello world 设置key-value
mset mset hello world java best 一次性设置或获取多个值
mget mget hello java
del del hello 删除key=hello
incr/decr incr count key值自增/自减1
incrby/decrby decr count
incrby/decrby incrby count 99 自增自减指定步长
incrby count 99
Hash键值类型
Hash类型用于存储结构化数据
name smith
emp:1 age 18
birthday 1983-11-21
height 172
Hash命令
命令 示例 说明
hget hget emp:1 age 获取hash种key=age的值
hset hset emp:1 age 23 设置hash中age=23
hmset hmset emp:1 age 30 name kaka
hmget emp:1 age name 获取hash多个值
hgetall emp:1 获取hash所有值
hdel hdel emp:1 age 删除user:1的age
hexists hexists emp:1 name 检查是否存在
hlen hlen emp:1 获取指定长度
说明:del key 是删除整个hash键为key的对象
hdel key field 是删除键为key下的某个字段
hgetall key :获取hash键值为key的对象的所有属性
hmset key field1 value1 field2 value2 …
一次性为key设置多个字段
hlen key 获取键等于key的字段长度
hexists key file 判断某个字段file在key下是否存在
存在则返回1,否则返回0
List列表类型
List列表就是一系列字符串的“数组”,按插入顺序排序
List列表最大长度为2的32次方-1,可以包含40亿个元素
List命令
rpush listkey c b a -右侧插入
lpush listkey f e d -左侧插入
rpop listkey -右侧弹出
lpop listkey -左侧弹出
lrange list 0 -1 [start,end] 查看list开始和结束位置的值
Set与Zset集合类型
Set与Zset都被称之为集合类型
Zset集合是字符串的无序集合,集合成员是唯一的
创建一个集合: sadd set1 value(为set1集合添加元素)
查看一个集合的所有元素:smembers set1 (查看set1集合所有元素)
sinter set1 set2 取交集(取set1与set2的集合的交集)
sunion set1 set2 取并集
sdiff set1 set2 差集(set1-set2)
Zset集合
zadd zset1 100 a (给zset1添加字符串a并设置分数100)
zadd zset1 101 b
… 它会默认按照给定的数字进行升序排序
zrange zset1 start_num stop
zrange zset1 0 -1
按照分数取值:zrangebyscore zset1 100 103
连同分数一起打印:zrange zset1 0 -1 withscores
Java客户端-Jedis
Jedis是java语言开发的Redis客户端工具包
Jedis只是对Redis命令的封装,掌握Redis命令便可以轻易上手
在linux的redis根目录下,用vim打开redis.conf的配置文件
在88行 protected-mode yes (修改为no)(关闭保护模式)
这样其它的电脑就可以连接这个redis服务
在69行的bind 修改为 0.0.0.0
退出并保存
启动服务器:./src/redis-server redis.conf
然后需要设置linux服务器防火墙,保证6379端口不被阻挡
需要使用centOs提供的防火墙服务:firewall-cmd --zone=public --add-port=6379/tcp --permanent (持久生效)
firewall-cmd --reload (重新加载)
看到success表示设置成功!
查看linux系统的ip地址
接下来登陆redis.io找到Jedis的下载地址
在官网标题点击Clients、下载java版的
java中利用jedis操作Redis
首先需要在maven的pom中添加jedis的依赖
redis.clients
jedis
2.9.0
jar
新建一个Test测试类:
//创建Jedis对象
Jedis jedis = new Jedis(“172.17.88.246”, 6379); //设置Ip地址和端口号
try{
jedis.auth(“12345”);
jedis.select(2);
System.out.println(“Redis连接成功!”);
//字符串
jedis.set(“sn”, “7781-9938”);
String res = jedis.get(“sn”);
System.out.println(res);
jedis.mset(new String[]{“title”, “婴幼儿奶粉”, “num”, “20”});
List stringList = jedis.mget(new String[]{“title”, “sn”, “num”});
System.out.println(stringList);
Long num = jedis.incr(“num”);
System.out.println(num);
//Hash
jedis.hset(“student:3312”, “name”, “小明”);
String name = jedis.hget(“student:3312”, “name”);
Map<String, String> map = new HashMap();
map.put(“name”, “王五”);
map.put(“age”, “28”);
map.put(“level”, “1”);
map.put(“scroe”, “98”);
jedis.hmset(“student:3314”, map);
map = jedis.hgetAll(“student:3314”);
System.out.println(map);
//List类型
jedis.del(“letter”);
jedis.rpush(“letter”, new String[]{“d”, “e”, “f”});
jedis.lpush(“letter”, new String[]{“c”, “b”, “a”});
jedis.lpop(“letter”);
jedis.rpop(“letter”);
List letters = jedis.lrange(“letter”, 0, -1);
System.out.println(letters);
//set
jedis.sadd(“boy”, “kitty”, “hash”);
Set set = jedis.smembers(“boy”);
System.out.println(set);
}catch (Exception e){
e.printStackTrace();
}
finally {
//关闭Jedis服务
jedis.close();
}
Redis缓存
public class CacheSample {
public CacheSample(){
List goodsList = new ArrayList();
goodsList.add(new Goods(8818, “红富士苹果”,15.5f,null));
goodsList.add(new Goods(8818, “脐橙”, 20.5f, null));
goodsList.add(new Goods(8818, “泰国榴莲”, 65.5f, null));
Jedis jedis = new Jedis(“172.17.88.246”);
try{
jedis.auth("12345");
jedis.select(3);
for (Goods goods:goodsList
) {
String json = JSON.toJSONString(goods);
System.out.println(json);
String key = "goods:" + goods.getGoosId();
jedis.set(key, json);
}
}catch (Exception e){
e.printStackTrace();
}finally {
jedis.close();
}
}
public static void main(String[] args) {
new CacheSample();
System.out.println("请输入要查询的商品编号:");
Scanner sc = new Scanner(System.in);
String id = sc.nextLine();
Jedis jedis = new Jedis("172.17.88.246");
try{
jedis.auth("12345");
jedis.select(3);
String key = "goods:" + id;
if (jedis.exists(key)) {
//key存在
String json = jedis.get(key);
Goods g = JSON.parseObject(json, Goods.class);
System.out.println(g);
}else{
System.out.println("您输入的商品编号不存在,请重新输入");
}
}finally {
jedis.close();
}
}
}