Redis基础
redis 安装:
1.到网上下载自己电脑对应的redis包,解压到某个文件夹:如图:
![](https://i-blog.csdnimg.cn/blog_migrate/26d9d9b43a3b6a0d831b96f028cf6341.png)
2.开启redis 服务:打开cmd ,切换到解压的目录下 输入运行:redis-server.exe redis.conf
![](https://i-blog.csdnimg.cn/blog_migrate/1fad679a99ca631ee020d760f2b0c811.png)
3.开启redis 客户端:第二个操作的cmd窗口不能关闭,保证服务端开启,再开启一个cmd 窗口,切换到解压目录下,输入运行:redis-cli.exe -h 127.0.0.1 -p 6379
![](https://i-blog.csdnimg.cn/blog_migrate/1d20712435ad7ac9ee1a087307bd05bc.png)
至此,redis安装开启完毕可以进行操作。
redis基础数据类型:
redis 存储数据为key-value的形式。
基础数据类型有:字符串(String)、哈希(Hash)、列表(List )、集合(set)、有序集合(sorted set)。
下述说明一些常用的操作命令:
在客户端cmd窗口输入命令
字符串(String)的基本操作:
set name “ccl” //该操作像redis数据库存入key为name value为ccl 的这样一个键值对。
get name //获取key 为name 所对应的value
getrange name 0 1 // 获取key为name的字符串索引0-1的子串
getset name "xadj" //设置key的值并返回现在的值
mget name age //获取name 和age 的值
setex name 10 "aaa" //设置name 的值为aaa 并设置name的有效性为10秒,十秒之后再get name 就得到name为空
setnx name ccl //当name为空的时候设置值为ccl 如果有值就不存储
append name ccl //在name的值串后面加上ccl
哈希(hash)的基本操作:
hmset myhash filed1 "ccl" filed2 "222" //创建一个hash 里面创建两个字段并赋值
hget myhash filed1 //获取myhash 中字段为filed1的值
hgetall myhash //获取myhash 中所以得字段和对应的值
hdel myhash filed1 //删除myhash中的字段filed1
hexists myhash filed1 //判断myhash中是否存在字段filed1
hkeys myhash //获取myhash 所有的key
hlen myhash //获取myhash中的字段数量
hsetnx myhash filed3 "aa" //当字段filed3不存在的时候才给他赋值,存在就不赋值
hvals myhash //获取myhash所有的值
lpush mylist aaa //往mylist列表中添加一个值aaa
blpop mylist 5 //移除mylist中的第一个值,设置超时时间为5秒,如果没有值等待五秒之后返回,五秒之内有值就返回
brpop mylist 5
//移除mylist中的第一个值,设置超时时间为5秒,如果没有值等待五秒之后返回,五秒之内有值就返回
lindex mylist 1 //获取索引为1的值
llen mylist //获取mylist长度
lpop mylist //移除并获取mylist第一个值
lrange mylist 0 10 //获取mylist中索引为0-10的值
lrem mylist count ccl //移除列表中某个元素
lset mylist 1 ccl //通过索引设置mylist的值
rpop mylist //移除mylist中最后一个值
集合(set)的基本操作
sadd myset ccl //往集合中添加元素
smembers myset //获取集合所有的元素
scard myset //获取集合元素个数
sdiff myset myset1 //获取两个几个的差集
sinter myset myset1 //获取两个集合交集
sismember myset ccl //判断ccl是都是myset中的元素
srandmember myset //随机返回集合中的一个元素
srem myset ccl //从myset 中移除ccl
sunion myset myset1 //获取myset 和myset1的并集
有序集合的基本操作:
zadd mysorted 1 ccl //往mysorted 中添加ccl 并关联一个数字1 有序集合根据这个数值排序
zcard mysorted //获取mysorted 中的集合个数
zrank mysorted qqq // 获取元素在集合中的索引
zrange mysorted 0 10 withscores //获取索引-0-10的值
zscore mysorted dd //获取dd关联的数字
HyperLogLog 基数统计
例如集合{1,3,4,5,6,7,1,2} 基数集为{
1,3,4,5,6,7,2} 为7,会有个误差,但是这个误差在可接受的范围
redis 发布订阅
发布订阅是一种消息通信机制:发布者,订阅者。订阅者先订阅某个频道,就会进入消息等待,发布者往频道发布消息之后,订阅者马上可以获得发布者的消息。
接着开启三个客户端加上之前那个四个客户端,三个客户端订阅频道。一个客户端发布消息
subscribe redischat //订阅频道为redischat
publish redischat chatmessage11111 //往redischat频道发送消息。
一个发布者发布消息之后,三个订阅者都可以一起接收到消息
![](https://i-blog.csdnimg.cn/blog_migrate/4c31b2f7205b5dbba424778ae3caf900.png)
Redid事务
redis事务与关系型数据库中的事务不同,没有原子操作性,可以理解为多个命令打包批量执行,中间某个命令出错,不会导致前面的命令回滚,也不会导致后面的命令不执行 。
multi //标记一个事务块的开始
exec //执行事务块
discard //取消事务块
![](https://i-blog.csdnimg.cn/blog_migrate/f83b51efe793fcbf8129941473df3716.png)
redis 数据备份和恢复:
备份:执行命令:save 或者bgsave (保存或者后台保存),在redis的目录下就会生成 dump.rdb文件,就是数据库的备份文件。
恢复:将保存的dump.rdb文件放到redis目录下,重启redis服务端就能恢复。
ps:执行名命令:config get dir 就能输出redis的目录 。
redis 安全
运行命令:config get requirepass 可以查看当前redis是否有密码
加密:config set requirepass redis 给当前的数据库加密为redis,在运行上面的命令就可以查看密码
加密之后客户端就要验证密码才能操作。。如果不验证密码的话操作 就会没有权限
![](https://i-blog.csdnimg.cn/blog_migrate/94650d44310f65bec6f30217aa568f58.png)
客户端验证密码的方式有两种:
1.直接运行auth redis 就可以
2.退出客户端,连接的时候直接验证密码:redis-cli.exe -h 127.0.0.1 -p 6379 -a redis
启动客户端的时候直接验证密码
java操作redis
首先先下载jar包:![](https://i-blog.csdnimg.cn/blog_migrate/bac492949269a90df3cc9f9f80288f8a.png)
code:
package com.ccl.test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import redis.clients.jedis.Jedis;
public class RedisTest {
private static Jedis jedis=new Jedis("127.0.0.1",6379);
public static void main(String[] args) {
// TODO Auto-generated method stub
//jedis.auth("redis");
//测试服务是否开启正常
System.out.println("server is running:"+jedis.ping());
operateSortSet();
}
//操作有序集合
public static void operateSortSet(){
jedis.zadd("javasortset", 0, "javaee");
jedis.zadd("javasortset", 2, "javase");
jedis.zadd("javasortset", 1, "javame");
//获取有序集合中的值
System.out.println("javasortset有序集合中的值:"+jedis.zrange("javasortset", 0, 10));
}
//操作set
public static void operateSet(){
jedis.sadd("javaset","javaee");
jedis.sadd("javaset","javase");
jedis.sadd("javaset","javame");
//获取javaset中的值
System.out.println("javaset中的值:"+jedis.smembers("javaset"));
System.out.println("javaset中是否存在javaee:"+jedis.sismember("javaset", "javaee") );
System.out.println("javaset中随机产生一个数:"+jedis.srandmember("javaset"));
System.out.println("javaset的个数:"+jedis.scard("javaset"));//返回集合的元素个数
}
//操作list
public static void operateList(){
//先删除list中的元素
jedis.del("javalist");
//往javalist添加值
jedis.lpush("javalist", "javaee");
jedis.lpush("javalist", "javase");
jedis.lpush("javalist", "javame");
//输出javalist前十个值
System.out.println("javalist中的值有:"+jedis.lrange("javalist", 0, 10));
//根据下标查找元素
System.out.println("javalist中下标为1的值为:"+jedis.lindex("javalist", 1));
//获取list长度
System.out.println("javalist的长度为:"+jedis.llen("javalist"));
}
//操作map
public static void operateMap(){
Map<String, String> map=new HashMap<String, String>();
map.put("name","ccl");
map.put("age", "23");
//存入map
jedis.hmset("user1", map);
//获取user1 的两个字段值
List<String> resultUser=jedis.hmget("user1","name","age");
System.out.println("获取user1的值为:"+resultUser);
//删除user1的age
jedis.hdel("user1", "age");
resultUser=jedis.hmget("user1","name","age");
System.out.println("获取user1的值为:"+resultUser);
//获取user1 的长度
System.out.println("user1的字段个数:"+jedis.hlen("user1"));
System.out.println("redis中是否存在user1:"+jedis.exists("user1"));
System.out.println("user1中所有的key:"+jedis.hkeys("user1"));
System.out.println("user1中所有的value:"+jedis.hvals("user1"));
}
//操作字符串
public static void operateString(){
//存入key的字符串
jedis.set("token", "javatest");
String token=jedis.get("token");
System.out.println("redis数据库中key为token的值为"+token);
//删除键值对
jedis.del("token");
token=jedis.get("token");
System.out.println("redis数据库中key为token的值为"+token);
//设置多个键值对
jedis.mset("name","ccl","age","23");
//获取age值
String age=jedis.get("age");
System.out.println("redis数据库中key为age的值为"+age);
jedis.incr("age");
age=jedis.get("age");
System.out.println("redis数据库中key为age+1的值为"+age);
//添加键值对对设置过期时间
jedis.setex("id", 20, "1000");
}
}