Redis原理和入门

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

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 的安装

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

上传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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VtxIOGld-1600933012501)(/img/bVbPfFz)]

配置

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

命令:[root@localhost redis]# vim redis.conf
:set nu 显示行号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j8iyfWfE-1600933012508)(/img/bVbPf3P)]

检测

命令:[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查找keykeys * /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自动加1incr k
decr自动减1decr 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.依赖的导入

<!-- jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>${jedis.version}</version>
</dependency>
<!--添加spring-datajar包  -->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.4.1.RELEASE</version>
</dependency>
@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> T toObject(String json,Class<T> 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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值