Redis

Redis

1. 什么是Redis

  1. Redis是一种key-value内存数据库
    • 底层算法就是散列表
  2. 性能极佳,查询110000次/秒,写80000次/秒
  3. 提供了持久化支持。
  4. Redis的Value支持5种数据类型,使用方便。

Redis查询性能非常优秀:在软件中经常做为数据库的缓存,提供软件的性能,也就是用于解决“高性能”问题。

2. Redis的用途

redis

  1. 数据库缓存
  2. Redis共享Session

3. 安装Redis

1. yum 安装

命令:

1
yum install redis

启动

1
x systyemctl start redis.service

检查

1
ps -A|grep redis

2. 编译安装

  1. 下载redis

    wget …

  2. 编译安装

    1
    2
    3
    cd redis-3.0.0
    make
    make install
  3. 位置:

    1
    /usr/local/redis/redis-3.0.0
  4. 启动redis

    1
    2
    cd /usr/local/redis/redis-3.0.0/src
    ./redis-server

    redis-server命令启动Redis服务器以后,当前窗口就被占用了,不能关闭! 关闭窗口或者 Ctrl+c 就是关闭Redis数据库。

4. Redis 命令

利用Redis客户端访问Redis数据库

redis2

5 String类型

string

  1. 帮助手册

    1
    help @string
  2. set 命令

    1
    set KEY VALUE
  3. get 命令

    1
    2
    get KEY
    //返回Value
  4. setrange

    • 修改字符串的内容

      setrange KEY 起始位置 替换值

      SET message “Hello World”
      SETRANGE message 6 “Redis”
      GET message
      “Hello Redis”

  5. strlen 检查字符串Value的长度

    1
    2
    3
    SET message "Hello World"
    STRLEN message
    11
  6. 操作字符中的位

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //设置位
    SETBIT times 0 1 //将第0位设为1
    SETBIT times 1 1 //将第1位设为1
    SETBIT times 4 1 //将第4位设为1
    get times
    "0xc8" // 2进制: 1100 1000
    //统计1的个数
    BITCOUNT times
    3

    bit

  7. 增加与减少

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    set score 100 
    incr score //增加1
    get score
    101
    decr score //减少1
    get score
    100

    incrby score 50 //将score增加50
    decrby score 50 //将score减少50
  8. 浮点数增加与减少

    1
    1. INCRBYFLOAT price 0.2
  9. 批量添加数据 批量查询数据

    1
    2
    mset key1 value1 key2 value2 key3 value3
    mget key1 key2 key3

6. Hash类型

value是一个Hash表,用于存储对象数据:

hash

操作指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//添加属性
hset key 属性名 属性值
//批量添加属性
hmset key 属性名1 属性值1 属性名2 属性值2 属性名3 属性值4
//获取一个属性
hget key 属性名1
//获取一组属性
hmget key 属性名1 属性名2 属性名3
//获取全部key
hkeys key
//获取全部的值
hvals key
//获取全部Hash对象信息
hgetall key

7. List类型

存储到Redis中的value是一个List,其用途是充当缓冲队列

List

操作命令:

1
2
3
4
lpush	//左侧放入
lpop //左侧取出
rpush //右侧放入
rpop //右侧取出

8. Redis 在程序如何使用它?

Jedis 访问redis java api

Redis-server & //后台运行
防火墙要关闭

pom.xml加上jedis依赖

1
2
3
4
5
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.6.0</version>
</dependency>

编写测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package jedis;

import org.junit.Test;

import redis.clients.jedis.Jedis;

public class TestJedis {
@Test
public void jedis(){
//连接redis服务器,ip+port
String ip = "127.0.0.1";
//获取到jedis对象
Jedis jedis = new Jedis(ip, 6379);
//调用redis set,key=name,value=tony
//jedis.set("name", "tony");
System.out.println(jedis.get("name"));
}
}

TestJedis.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package jedis;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

public class TestJedis {
@Test
public void jedis(){
//连接redis服务器,ip+port
String ip = "192.168.27.113";
//获取到jedis对象
Jedis jedis = new Jedis(ip, 6379);
//调用redis set,key=name,value=tony
//jedis.set("name", "tony");
System.out.println(jedis.get("name"));
}

@Test //分片Shard池化
public void sharded(){
//创建一个Sharded池配置对象
JedisPoolConfig config = new JedisPoolConfig();
//最大的连接数
config.setMaxTotal(50);

//连接多个redis节点,ip和port的信息
List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
//一个的节点信息就ok
JedisShardInfo info1 =
new JedisShardInfo("192.168.27.113",6379);
shards.add(info1);

//创建分片池
ShardedJedisPool pool =
new ShardedJedisPool(config, shards);

//从池中获取一个jedis链接
ShardedJedis jedis = pool.getResource();
System.out.println(jedis.get("name"));
}
}

把jedis和spring框架整合
通过xml配置把jedis的对象创建交给spring框架。

8.1 在哪里使用缓存?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package cn.tedu.store.service;

import java.io.IOException;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import cn.tedu.store.bean.dict.Area;
import cn.tedu.store.bean.dict.City;
import cn.tedu.store.bean.dict.Province;
import cn.tedu.store.mapper.DictMapper;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

@Service("dictService")
public class DictServiceImpl implements DictService {

@Resource
private DictMapper dictMapper;
//获取spring框架创建的jedis对象
@Resource
private ShardedJedisPool shardedJedisPool;
//转换对象到json或者json到java对象工具类
private static final ObjectMapper MAPPER = new ObjectMapper();

public List<Province> getProvinceList() {
return dictMapper.getProvinceList();
}

public List<City> getCityList(String provinceCode){
List<City> cityList = null;
//设置redis key的规则
String KEY = "TS_CITY_"+provinceCode;

//由池中获取jedis对象
ShardedJedis jedis = shardedJedisPool.getResource();

//1.从redis中获取数据,如果有数据直接返回
//注意set设置2次就会被覆盖
if(jedis.exists(KEY)){ //判断key是否存在
String json = jedis.get(KEY);
JsonNode jsonNode;
try {
//从缓存中获取数据,然后把json转成java对象,然后直接返回,无需访问数据库
jsonNode = MAPPER.readTree(json);
Object obj = MAPPER.readValue(jsonNode.traverse(),
MAPPER.getTypeFactory().constructCollectionType(List.class, City.class));
return (List<City>) obj; //减轻数据库访问压力
} catch (Exception e) {
e.printStackTrace();
}
}else{
//传统方式直接从数据库读取数据
cityList = dictMapper.getCityList(provinceCode);

//2.第一访问时redis没有值,必须从数据库中获取值后,把值放入redis
//把java list集合转成字符串json
try {
String json = MAPPER.writeValueAsString(cityList);
jedis.set(KEY, json);
return cityList;
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}

public List<Area> getAreaList(String cityCode) {
return dictMapper.getAreaList(cityCode);
}

public String getProvinceNameByCode(String provinceCode) {
return dictMapper.getProvinceNameByCode(provinceCode);
}

public String getCityNameByCode(String cityCode) {
return dictMapper.getCityNameByCode(cityCode);
}

public String getAreaNameByCode(String areaCode) {
return dictMapper.getAreaNameByCode(areaCode);
}

}

8.2 Redis缓存应用注意点:

1、 是不是所有的数据都能放在缓存中?

Reids能否替代mysql?

当然不是,

缓存是存放热点数据,不会频繁修改的数据!!

内存掉电会有什么问题?

数据丢失。Redis每秒钟会自动存盘c++。MemCache

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2023 高行行
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信