Redis基本操作

2019-05-22  本文已影响0人  突突兔007

Redis

Redis入门

   Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区

Redis下载

下载地址:http://download.redis.io/releases/redis-3.2.8.tar.gz

Redis的安装

   这里在mac下模拟安装,如果需要在linux或者window下安装的话,请自行百度。这里以3.2.8为例

Redis的启动和关闭

启动:
   在命令行输入命令 redis-server,默认链接Redis(127.0.0.1:6379) 启动,如果出现蛋糕图案说明安装成功。

关闭:

Redis键

常用命令:

Redis数据类型

127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> 

如果key已经存在则覆盖已经存在的值。

hset key filed value
hget key filed
hmset key filed value [filed value...]
hmget key filed [filed...]
hgetall key

127.0.0.1:6379> hmset user:1 usernmae zhangsan password 123456 age 18 address xian
OK
127.0.0.1:6379> hgetall user:1
1) "usernmae"
2) "zhangsan"
3) "password"
4) "123456"
5) "age"
6) "18"
7) "address"
8) "xian"
127.0.0.1:6379> 
127.0.0.1:6379> hmget user:1 age
1) "18"

127.0.0.1:6379> lpush lisi xianren
(integer) 1
127.0.0.1:6379> lpush lisi 18
(integer) 2
127.0.0.1:6379> lpush lisi qinguo
(integer) 3
127.0.0.1:6379> lrange lisi 0 10
1) "qinguo"
2) "18"
3) "xianren"
127.0.0.1:6379> 
127.0.0.1:6379> sadd redis hao haoyong henhaoyong
(integer) 3
127.0.0.1:6379> sadd redis shizhendehaoyong
(integer) 1
127.0.0.1:6379> smembers redis
1) "hao"
2) "haoyong"
3) "henhaoyong"
4) "shizhendehaoyong"
127.0.0.1:6379> 
127.0.0.1:6379> zadd wangwu 1 a
(integer) 1
127.0.0.1:6379> zadd wangwu 0 b
(integer) 1
127.0.0.1:6379> zadd wangwu 3 c
(integer) 1
127.0.0.1:6379> zadd wagnwu 2 d
(integer) 1
127.0.0.1:6379> zrangebyscore wangwu 0 5
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> 

解析配置文件

查看数据库大小

使用info命令查看数据库使用情况

used_memory:数据占用了多少内存(字节
used_memory_human:数据占用了多少内存(带单位的,可读性好)
used_memory_rss:redis占用了多少内存
used_memory_peak:占用内存的峰值(字节)
used_memory_peak_human:占用内存的峰值(带单位的,可读性好)

127.0.0.1:6379> info
......
......
# Memory
used_memory:886548
used_memory_human:865.77K
used_memory_rss:2068480
used_memory_rss_human:1.97M
used_memory_peak:886548
used_memory_peak_human:865.77K
used_memory_peak_perc:100.12%
used_memory_overhead:884987
used_memory_startup:835253
used_memory_dataset:1561
used_memory_dataset_perc:3.04%
......
......

Redis的持久化

Redis的事务

   MULTI 命令用于开启一个事务,它总是返回 OK。 MULTI 执行之后, 客户端可以继续向服务器发送任意多条命令, 这些命令不会立即被执行, 而是被放到一个队列中, 当 EXEC命令被调用时, 所有队列中的命令才会被执行。
另一方面, 通过调用 DISCARD , 客户端可以清空事务队列, 并放弃执行事务
demo如下

127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr foo
QUEUED
127.0.0.1:6379> incr bar
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 1
127.0.0.1:6379> 

发生回滚的的原因

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key value
QUEUED
127.0.0.1:6379> set key
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> errorcommand key
(error) ERR unknown command 'errorcommand'
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get key
(nil)
127.0.0.1:6379> 

   当遇到语法错误的时候,后面执行exec的命令时,系统会discarded事务。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key 1
QUEUED
127.0.0.1:6379> sadd key 2
QUEUED
127.0.0.1:6379> set key 3
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
127.0.0.1:6379> get key
"3"
127.0.0.1:6379> 

Redis 分区

   分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你最多只能使用一台机器的内存。
分区使Redis的计算能力通过简单地增加计算机得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。

Redis的订阅发布

Redis的复制

Redis的Java客户端Jedis

Spring Boot整合Redis

yml配置文件

spring:
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password:
    pool:
      max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
      max-wait: -1  # 连接池最大阻塞等待时间(使用负值表示没有限制
      max-idle: 8   # 连接池中的最大空闲连接
      min-idle: 0   # 连接池中的最小空闲连接
    timeout: 0      # 链接超时时间

ServiceImpl.java如下

package com.yao.service;

import com.yao.domain.City;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

/**
 * Created by yaochenglong on 17/11/20.
 * CityServiceImpl demo
 */
@Service
public class CityServiceImpl implements CityService {

    private static Logger logger = Logger.getLogger(CityServiceImpl.class);

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public City findCityById(String id) {
        String key ="city"+id;

        ValueOperations<String,City> operations = redisTemplate.opsForValue();
        Boolean hasKey = redisTemplate.hasKey(key);
        if(hasKey){
            City city = operations.get(key);
            logger.info("CityServiceImpl.findCityById() : 从缓存中获取了城市>>"+city.getCityName());
            return city;
        }

        //模拟从数据库中获取数据
        City city = new City();
        city.setId("123");
        city.setCityName("西安");
        city.setDescription("爱我大西安");
        operations.set(key,city);
        System.out.println("ityServiceImpl.findCityById() : 从数据库中获取了城市");
        return city;
    }

    @Override
    public Long updateCity(City city) {

        //Long ret = cityDao.updateCity(city);
          Long ret = 1l;

        // 缓存存在,删除缓存

        String key = "city_" + city.getId();

        boolean hasKey = redisTemplate.hasKey(key);

        if (hasKey) {

            redisTemplate.delete(key);


            logger.info("CityServiceImpl.updateCity() : 从缓存中删除城市 >> " + city.toString());

        }


        return ret;

    }
}

Controller 如下

package com.yao.controller;

import com.yao.domain.City;
import com.yao.service.CityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by yaochenglong on 17/11/20.
 */
@RestController
public class CityController {
    @Autowired
    private CityService cityService;

    @GetMapping("/city/get/{id}")
    public String getCity(@PathVariable("id") String id){
        City city = cityService.findCityById(id);
        return city.getCityName();
    }
}

连续访问请求两次,结果如下:

2017-11-20 22:19:59.985  INFO 1179 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2017-11-20 22:19:59.985  INFO 1179 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2017-11-20 22:19:59.995  INFO 1179 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 10 ms
ityServiceImpl.findCityById() : 从数据库中获取了城市
2017-11-20 22:20:01.704  INFO 1179 --- [nio-8080-exec-3] com.yao.service.CityServiceImpl          : CityServiceImpl.findCityById() : 从缓存中获取了城市>>西安

   我们可以看到第一次从数据库中获取数据,第二次访问则从缓存中获取数据。

高可用性

上一篇 下一篇

猜你喜欢

热点阅读