Redis原理和入门

Redis原理和入门_第1张图片

http://redis.cn/官网

1 关于Redis

1.1 概念

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库(非关系型数据库,K-V结构)、缓存(最主要的功能,用来存储常用不长变化的数据,减轻数据库的压力)和消息中间件(取完就没有了)

1.2 特点

它支持多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets)与范围查询, bitmaps, hyperloglogs和 地理空间(geospatial)索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction)[事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

2 Redis 的安装

Redis原理和入门_第2张图片

上传redis压缩包进行解压管理

命令:[root@localhost src]# tar -xvf redis-5.0.4.tar.gz
命令:[root@localhost src]# mv redis-5.0.4.tar.gz soft
命令:[root@localhost src]# mv redis-5.0.4 redis
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I2DvKqqR-1600933012498)(/img/bVbPfDZ)]

安装

命令:[root@localhost redis]# cd /usr/local/src/redis
命令:[root@localhost redis]# make
命令:[root@localhost redis]# make install
Redis原理和入门_第3张图片

配置

Redis原理和入门_第4张图片

命令:[root@localhost redis]# vim redis.conf
:set nu 显示行号
Redis原理和入门_第5张图片

检测

命令:[root@localhost redis]# redis-server redis.conf 打开redis
命令:[root@localhost redis]# ps -ed |grep redis 检查redis状态
命令:[root@localhost redis]# redis-cli -p 6379进入redis
命令:[root@localhost redis]# redis-cli -p shutdown关闭edis
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e4J04JL5-1600933012511)(/img/bVbPf6S)]

3 Redis 常用命令练习

String
命令 含义 运用
set 添加Key-Value数据 set key value
get 根据key获取数据 get key
strlen 根据key获取长度 strlen key
exists 判断key是否存在 exists key(1存在反之0)
del 删除数据 del key
keys 查找key keys * /keys nam?/keys n*
mset 赋值多个 mset k1 v1 k2 v2
mget 获取对个key的值 mget k1 k2
append 对某个key追加 append k v
type 检查某个key的类型 type k
select 切换数据库 0-15共16个,默认第一个
flushdb 清空单个数据库 flushdb
flushall 清空所有数据库 flushall
incr 自动加1 incr k
decr 自动减1 decr k
incrby 指定数值增加 incrby k 10
decrby 指定数值减少 decrby k 10
expire 指定key的生效时间 秒 expire k 10
pexpire 指定key的生效时间 毫秒 pexpire k 100
ttl 检查剩余存活时间 ttl k(-2不存在-1不超时)
Hash
命令 含义 运用
hset 为对象添加数据 hset obj k v
hget 获取对象数据 hget obj k
hexists 判断对象属性是否存在 hexists obj k
hdel 删除对象属性 hdel obj k
hgetall 获取对象全部属性和值 hgetall obj
hkeys 获取所有字段 hkeys k
hlen 获取所有属性的数量 hlen k
hmget 获取hash中指定字段的值 hmget obj k
hmset 为多个字段设定值 hmset obj k v
hsetnx 设定字段当字段不存在时有效 hsetnx obj k v
hstrlen 获取指定key的值长度 hstrlen obj k
hvals 获取hash所有值 hvals obj
List

说明:Redis中的List集合是双端循环列表,分别可以从左右两个方向插入数据.
List集合可以当做队列使用,也可以当做栈使用
队列:存入数据的方向和获取数据的方向相反
栈:存入数据的方向和获取数据的方向相同

命令 含义 运用
lpush 左侧入队一个或者多个元素 lpush k v/[v…]
rpush 右侧入队一个或者多个元素 rpush k v/[v…]
lpop 左侧出队一个元素 lpop k
rpop 右侧出队一个元素 rpop k
lpushx 左侧入队一个元素(队列存在) lpush key v
rpushx 右侧入队一个元素(队列存在) rpushx key v
lrange 获取指定的元素 lrange key start stop
Redis事务

说明:redis中操作可以添加事务的支持.一项任务可以由多个redis命令完成,如果有一个命令失败导致入库失败时.需要实现事务回滚.

命令 含义 运用
multi 标记一个事务开始 jedis.multi
exec 执行所有multi之后发出命令 transaction.exec()
discard 丢弃所有multi之后发的命令 transaction.discard()

4 Redis 的远程访问

说明:编写程序访问Linux系统上的Redis

4.1 思路:

实例化一个redis对象,调用里面的`public Jedis(String host, int port) {super(host, port);构造方法进行测试。
前提
1.远程服务器redis已经打开
2.依赖的导入



    redis.clients
    jedis
    ${jedis.version}



    org.springframework.data
    spring-data-redis
    1.4.1.RELEASE

@Test
public void test01(){
    Jedis jedis = new Jedis("192.168.126.129",6379);
    jedis.set("redis","test");
    System.out.println(jedis.get("redis"));
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a3dhM3a8-1600933012513)(/img/bVbPeLO)]

4.2 Redis 的事务处理

/**
 * 事务的控制
 * 说明:操作单台Redis使用于事务控制
 * 多台不太适用
 */
@Test
public void testTx() {
    Jedis jedis = new Jedis("192.168.126.129", 6379);
    Transaction transaction = jedis.multi();
    try {
        transaction.set("aaa","bbb");
        transaction.exec();
    }catch(Exception e){
        transaction.discard();
    }
}

4.3 Redis 事务的原子性操作

/**
 * 添加一个数据,只有数据存在时才会赋值,并且要添加超时时间,保证原子性操作
 *
 *     private static final String XX = "xx";  //有key的时候才赋值
 *     private static final String NX = "nx"; //没有key的时候才赋值
 *     private static final String PX = "px";  //秒
 *     private static final String EX = "ex";  //毫秒
 *     Redis分布式锁
 */
@Test
public void test05() {
    Jedis jedis = new Jedis("192.168.126.129", 6379);
    SetParams setParams = new SetParams();
    setParams.xx().ex(10);
    jedis.set("aaa","aaa",setParams);
}

4.4 Redis 工具类的编写

Redis 工具类要实现的是对象和JSON之间的相互转化。

package com.jt.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.util.StringUtils;
/**
 * 实现对象和JSON之间的相互转化
 *      1.将任意对象转化为JSON
 *      2.将任意的JSON转化为对象
 *
 */public class ObjectMapperUtil {
    //定义常量对象
 //1.节省空间
 //2.不能篡改
 private static final ObjectMapper MAPPER = new ObjectMapper();
    /**
 * 1.将任意对象转化为JSon
 *  1.1 任意对象用object对象来接
 *  1.2 返回值是JSON串,所以应该是String
 *  1.3 使用什么方法转化JSON FASTJSON/objectMapper
 */ public static String toJSON(Object object){
        try {
            if(object==null){
                throw new RuntimeException("传递的参数为空,检查传参!");
            }
            return MAPPER.writeValueAsString(object);
        }catch (JsonProcessingException e){
            e.printStackTrace();
            //应该将检查异常转化为运行时异常
 throw new RuntimeException("转化有误!不支持json转化,检车是否有get/set方法");
        }
    }
    //2.将任意的JSON转化为对象
 public static  T toObject(String json,Class target){
        if(StringUtils.isEmpty(json) || target == null){
            throw new RuntimeException("传递参数不能为空");
        }
        try {
            return MAPPER.readValue(json,target);
        }catch (JsonProcessingException e){
            e.printStackTrace();
            throw new RuntimeException("json 转化异常");
        }
    }
}
4.5 测试
@Test
public void test03(){
    ItemDesc itemDesc = new ItemDesc();
    itemDesc.setItemId(1L)
            .setItemDesc("测试")
            .setCreated(new Date())
            .setUpdated(new Date());
    String json = ObjectMapperUtil.toJSON(itemDesc);
    ItemDesc itemDesc2 =
            ObjectMapperUtil.toObject(json,ItemDesc.class);
    System.out.println(json);
    System.out.println(itemDesc2);
}

你可能感兴趣的:(redis)