key-value
形式的数据。key-value
中 的 value 比较强大,它的value可以不仅仅是一个byte[] (zookeeper只能存byte[])
value
可以有结构 :可以是一个List,也可以是一个hash(简单的理解为:value里也可以存key-value),也可以是set…所以redis经常被称作为----数据结构服务器。因为redis安装需要 依赖c语言环境,所以需要gcc进行编译。
然后上传 redis-3.2.8.tar.gz
到Linux目录下/usr/java
,并解压该tar包。
注意: make install
默认会安装在 /usr/local/bin
,也可以自己指定目录make PREFIX=/usr/java/redis install
中间加路径即可。
1 . 启动 redis 服务端- 服务器端启动 /usr/local/bin
执行 redis-server
。
2. 客户端启动: 然后再启动一个连接,/usr/local/bin
目录下执行 redis-cli
客户端启动。
key-value
形式。其实还有3种特殊类型但是一般不刻意使用。
set key value
存放数据 ,如果添加的key值相同,则覆盖value值。 // 添加数据 set key value
set name zhangsan
get key
查看value值 // 查看value值 get key
get name
keys *
显示所有key值 // 显示所有key值 keys *
keys *
del key
删除key值,相应的数据也会删除。 // 删除key del key
del name
dbsize
显示key总数。 如,有多少个键值对。 // 查看当前key总数 dbsize
dbsize
rename key newkey
重命名key // 将key值重命名 rename key newkey
rename name name1
exists key
检查键值是否存在 // 检查键值是否存在 exists key
exists name
type key
显示键的类型 // 查看键的类型 type key
type name
添加List操作,lpush/rpush
明白什么是从左侧添加? 什么是从右侧添加?
lpush key value1[value2...]
rpush key value 1[value2...]
// 1.往redis中添加list 从左边开始添加
lpush grils liuyifei yangmi angelbaby zhaoliying
// 2.往redis中添加list 从右侧开始添加
rpush boys liudehua zhangxueyou guofucheng liming
查询操作
lindex key index
lrange key start index stop index
llen key
//1. 根据索引查询
lindex girls 0 //左插入,返回结果 "zhaoliying"
lindex boys 0 // 右插入,返回结果 "liudehua"
//2. 通过元素获取
lrange girls 0 -1 //0~-1指获取全部
lrange girls 0 1 // zhaoliying angelbaby
// 3.显示列表长度
llen boys // 4
删除操作,每次只删除一个。
lpop key
rpop key
//1.从左边删除一个
lpop girls // zhaoliying
//2.从右边删除第一个
rpop girls // liuyifei
删除操作 ,删除指定元数 。
lrem girls count yangmi
// 删除指定元素 count 指定数量
lrem girls 8 yangmi // 即删除list 中 8个yangmi
修改操作
- 修改指定索引 lset key index value
// 修改索引 0 的元素为ruhua
lset girls 0 ruhua
添加元素 不存储相同的集合元素。
sadd key value1 [value2] ...
添加元素, // 添加元素
sadd friends a b c d d d e // 只能添加一个d
显示出集合所有元素。 smembers key
,显示无序!
scard key
// 1.显示出集合中所有元素
smembers friends //列出所有 b c d e a 因为是无序!
//2 .获取成员个数
scard friends // 5
删除集合中元素 srem key value 1 [ value2]...
。
spop key
// 1 删除一个或者多个
srem friends a b c // 删除 a b c
// 2.随机删除元素
spop friends // 随机删除 并返回删除元素
集合之间的操作。
sinter key1[key2]...
//1.返回多个集合之间的交集
sinter friends friendss //
sunion key1 key2 ...
//1.返回集合之间的并集,即集合合并去除重复。
sunion friends friendss //相当于合并集合
sdiff key1 key2 ...
//1.取集合之间的差集,即去除相同元素
sdiff friends friendss //去除同类元素
二者区别在于 “程序员删库跑路事件”
// 清空所有数据库
1. flushall
// 清空当前数据库
2. flushdb
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
public class Redis_Client {
Jedis jedis =null;
@Before
public void init() {
/* 1.通过jedis对象创建连接。
new jedis(host,prot)即可
*/
jedis = new Jedis("192.168.150.140", 6379);
String ping = jedis.ping();
System.out.println(ping); //返回 pong
}
@Test
public void testSet(){
String data = jedis.set("name", "刘亦菲");
System.out.println(data);
}
@Test
public void testGet(){
String name = jedis.get("name");
System.out.println(name);
}
}
public class Product_redis {
@Test
public void setProduct() throws IOException {
Jedis jedis = new Jedis("192.168.150.140", 6379);
Product p = new Product("001","明星同款空调房披肩外搭女秋冬季米灰刘-亦菲同款 190*65cm",89);
/*
将对象转成字节数组 object to bytearray
set(byte[],byte[])
*/
ByteArrayOutputStream bs = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bs);
oos.writeObject(p);
jedis.set(p.getP_id().getBytes(),bs.toByteArray());
jedis.close();//关闭
}
@Test
public void getProduct() throws IOException, ClassNotFoundException {
Jedis jedis = new Jedis("192.168.150.140", 6379);
byte[] bytes = jedis.get("001".getBytes());
/*
//打印的是字节数组,不是我们想要的。
for (byte b:bytes){
System.out.println(b);
}
*/
/*需要将对象进行反序列化 bytearray to object
*/
ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bi);
//转换类型将 object 转为product
Product p=(Product)ois.readObject();
System.out.println(p.getP_id()+" ----"+p.getTitle()+"-----"+p.getPrice());
jedis.close();
}
}
public class Product implements Serializable { //实现序列化
private String p_id; //商品id
private String title; //商品标题
private double price; //价格
public Product(String p_id, String title, double price) {
this.p_id = p_id;
this.title = title;
this.price = price;
}
public Product() {
}
public String getP_id() {
return p_id;
}
public void setP_id(String p_id) {
this.p_id = p_id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
public class Redis_Client {
Jedis jedis =null;
@Before
public void init() {
/* 1.通过jedis对象创建连接。
new jedis(host,prot)即可
*/
jedis = new Jedis("192.168.150.140", 6379);
String ping = jedis.ping();
System.out.println(ping); //返回 pong
}
/*
list操作
*/
@Test
public void testList(){
//1.从左侧开始插入
Long lpush = jedis.lpush("nba", "kobe", "jordan", "rose", "ai", "curry");
System.out.println(lpush); //返回长度
//2.从右侧开始插入
jedis.rpush("wnba","canglaoshi","xiaozhelaoshi","guanyuelaoshi");
}
@Test
public void testLrange(){
List<String> nba = jedis.lrange("nba", 0, -1);
System.out.println(nba); //[curry, ai, rose, jordan, kobe]
}
@Test
public void testPop(){
String rnba = jedis.rpop("nba");
System.out.println("从右边删除:" +rnba); //kobe
String lnba = jedis.lpop("nba");
System.out.println("从左边删除:" +lnba); //curry
}
@Test
public void testListSet(){
String lset = jedis.lset("nba", 0, "caixukun");
System.out.println(lset); // //[caixukun, ai, rose, jordan, kobe]
}
}
public class Redis_Client {
Jedis jedis =null;
@Before
public void init() {
/* 1.通过jedis对象创建连接。
new jedis(host,prot)即可
*/
jedis = new Jedis("192.168.150.140", 6379);
String ping = jedis.ping();
System.out.println(ping); //返回 pong
}
/*
set操作
*/
@Test
public void test_Set(){
//1. 添加操作
Long sadd = jedis.sadd("num", "a", "b", "c", "d", "e");
//2.获取成员个数
Long num = jedis.scard("num");
System.out.println("set集合中value个数"+num);
//3.显示所有
Set<String> word = jedis.smembers("num");
for (String n : word){
System.out.println("循环遍历个数:" +n);
}
//4. 删除
Long srem = jedis.srem("num", "e", "a");
System.out.println("删除的set集合元素"+srem);
}
}
public class Redis_Client {
Jedis jedis =null;
@Before
public void init() {
/* 1.通过jedis对象创建连接。
new jedis(host,prot)即可
*/
jedis = new Jedis("192.168.150.140", 6379);
String ping = jedis.ping();
System.out.println(ping); //返回 pong
}
@Test
public void test_SetandSet(){
//1.取交集
Set<String> sinter = jedis.sinter("num", "num1");
System.out.println("取交集:"+sinter);
//2.取并集
Set<String> sunion = jedis.sunion("num", "num1");
System.out.println("取并集:"+sunion);
//3.取差集 前面的集合为主,去除包含后面的元素。
Set<String> sdiff = jedis.sdiff("num1", "num");
System.out.println("取差集:"+sdiff);
}
}
key - field(字段属性) - value
public class Redis_Hash {
private Jedis jedis = null;
@Before
public void init (){
jedis = new Jedis("192.168.150.140", 6379);
System.out.println(jedis);
}
@Test
public void testHash(){
/*
1.添加数据, hset(String var1, String field, String var3);
*/
jedis.hset("cart","苹果","1");
jedis.hset("cart","香蕉","3");
jedis.hset("cart","橘子","5");
/*1.1
添加多个key value
*/
Map<String, String> hash = new HashMap();
hash.put("猕猴桃","1");
hash.put("冬枣","2");
hash.put("青瓜","5");
jedis.hmset("cart",hash);
/*2. 获取数据
hget(key,fild); //第一个key值 第二个是value中的 key
*/
String hget = jedis.hget("cart", "苹果");
System.out.println(hget);
/*2.1 返回多个
hgetAll(key),通过key返回里面的value(key -value)。
*/
Map<String, String> cart = jedis.hgetAll("cart");
System.out.println(cart);//{青瓜=5, 猕猴桃=1, 苹果=1, 香蕉=3, 橘子=5, 冬枣=2}
/*3. 向cart中 冬枣 添加4个
青瓜 减掉3个
hincrBy(key,field,value)
*/
jedis.hincrBy("cart","冬枣",4);
jedis.hincrBy("cart","青瓜",-3);
Map<String, String> cart1 = jedis.hgetAll("cart");
System.out.println(cart1);//{青瓜=2, 猕猴桃=1, 苹果=1, 香蕉=3, 橘子=5, 冬枣=6}
/*4. 删除hash表中的一个字段
*/
jedis.hdel("cart","橘子");
Map<String, String> cart2 = jedis.hgetAll("cart");
System.out.println(cart2);//{青瓜=2, 猕猴桃=1, 苹果=1, 香蕉=3, 冬枣=6}
/*5.判断是否存在hash值
hexists(key,field)
*/
Boolean hexists = jedis.hexists("cart", "橘子");
System.out.println(hexists);//false
}
}
public class Redis_Zset {
private Jedis jedis =null;
@Before
public void init(){
jedis = new Jedis("192.168.150.140", 6379);
System.out.println(jedis);
}
/**
* 带排序的set集合
* 例如:qq音乐排行榜
* 收听 万单位 人名
*/
@Test
public void test_Zset(){
// 1.添加数据
jedis.zadd("music",300,"周杰伦");
jedis.zadd("music",80,"林俊杰");
jedis.zadd("music",90,"王力宏");
jedis.zadd("music",10,"蔡徐坤");
//2.获取数据 升序
Set<String> music = jedis.zrange("music", 0, -1);
System.out.println(music);
//2.1 获取数据 降序 reverse
Set<String> revmusic = jedis.zrevrange("music", 0, -1);
System.out.println(revmusic);
//3. 取某个元素的索引 从升序中取
Long zrank = jedis.zrank("music", "王力宏");
System.out.println(zrank);
//3.1 取某个元素索引 从降序中取
Long zrevrank = jedis.zrevrank("music", "王力宏");
System.out.println(zrevrank);
//4.返回某个成员的分数值。
Double music1 = jedis.zscore("music","王力宏");
System.out.println(music1); //90
//5.删除元素
Long zrem = jedis.zrem("music", "林俊杰");
System.out.println(zrem);
//6. 对有序集合上进行增量
Double zincrby = jedis.zincrby("music", 3, "周杰伦");
System.out.println(zincrby);
}
}
[蔡徐坤, 林俊杰, 王力宏, 周杰伦]
[周杰伦, 王力宏, 林俊杰, 蔡徐坤]
2
1
90.0
1
303.0
zrangeByScoreWithScores()
方法使用。/**
客户端采集
*/
public class Movie_Customer {
public static void main(String[] args) throws InterruptedException {
//1.连接客户端
Jedis jedis = new Jedis("192.168.150.140", 6379);
//2. 创建一个数组里面存储电影
String[] movies = {"战狼","战狼2","复仇者联盟","复仇者联盟2","复仇者联盟3","复仇者联盟4"};
//3.随机访问观看
Random random = new Random();
while (true){
//4 随机挑一个电影观看
String movie = movies[random.nextInt(movies.length)];
/*4.1
放入redis中,后面会统计观看
相当于更新 观看点击次数,每次进行加1 在挑选的基础上
*/
jedis.zincrby("movie",1,movie);
//5. 看时间不定,假设在看电影
System.out.println("电影观看中-------");
Thread.sleep(300);
}
}
}
/**
显示观看排行榜
*/
public class Movie_Box {
public static void main(String[] args) throws InterruptedException {
Jedis jedis = new Jedis("192.168.150.140", 6379);
while (true){
// //1.显示 redis数据,即显示观看次数 ,选择升序还是降序!
// Set movie = jedis.zrevrange("movie", 0, -1);//显示全部
// System.out.println(movie);
// 1.1 需要显示members 和 key值 zrangeByScoreWithScores 指定区间
Set<Tuple> movie = jedis.zrangeByScoreWithScores("movie", 0, 100, 0, 10);
for (Tuple t : movie){
System.out.println(t.getElement()+"---"+t.getScore());
}
//2.显示查看, 在15秒查询5次。
Thread.sleep(1500);
System.out.println("------------------------");
}
}
}
MemoryCache
它提供了持久化的能力。