当前位置: 首页>后端>正文

Redis初识

Redis介绍

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

小白理解:就是个软件,安装在电脑上启动之后,会占用电脑8G内存中的一部分内存,来存储需要缓存的数据。访问内存效率和访问磁盘效率的速度级别不一样,所以这部分缓存内存还是比较珍贵的,当然生产机器的内存在128G以上倒是可以缓存不少数据。

一般什么情况下可以使用Redis

  • 1 缓存:

简单举例,用户相同URL+参数请求到后台,后台先去访问Redis缓存,第一次访问key=URL+参数,没有缓存,本次直接访问MySQL数据库,并且把结果存到Redis缓存中,在缓存有效期内,从第2次之后的所有请求,都访问Redis缓存中的数据,达到高峰期减少数据库的查询负担。

  • 2 分布式锁:

目前比较流行微服务架构,单机JVM锁不足以达到同步资源竞争的目的,此时可以借助Redis设置key值线程互斥特性(只要可以达到线程安全互斥功能的软件都可以用来实现分布式锁功能,例如:数据库InnoDB引擎行级锁、zookeeper的set节点方法等)这里就不细说了。

一、安装

略...

二、常用命令

默认安装 Redis有16个数据库分别为 Database 0-15

1 启动命令

  • For Linux
# bin目录下直接启动
> redis-server 
# bin目录下作为后台程序启动
> nohup redis-server &
  • For Windows10
# 第一步
> cd C:\Program Files\Redis
# 第二步 配置文件
> redis-server.exe redis.windows.conf
  • For Mac
# bin目录下直接启动
> redis-server 

2 选择数据库命令

# 选择第0个数据库 当然默认最大值为15
127.0.0.1:6379> select 0
OK

3 存取数据命令

  • String格式
# 设置中文
127.0.0.1:6379> set name 张三
OK
127.0.0.1:6379> get name
"\xe5\xbc\xa0\xe4\xb8\x89"

# 设置数字
127.0.0.1:6379> set age 100
OK
127.0.0.1:6379> get age
"100"
  • list集合格式
# 设置长度为4的list key=nums
127.0.0.1:6379> lpush nums 1
(integer) 1
127.0.0.1:6379> lpush nums 2
(integer) 2
127.0.0.1:6379> lpush nums 3
(integer) 3
127.0.0.1:6379> lpush nums 5
(integer) 4

# 获取nums内容
127.0.0.1:6379> lrange nums 0 4
1) "5"
2) "3"
3) "2"
4) "1"
# 截取长度超过总长度 默认取最大值
127.0.0.1:6379> lrange nums 0 5
1) "5"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> 

#获取nums长度
127.0.0.1:6379> llen nums
(integer) 4

list定位、删除等功能后续补上,由于时间关系这里就不列举了

  • set集合格式
# 给集合demos中添加元素1235 四个值
127.0.0.1:6379> sadd demos 1
(integer) 1
127.0.0.1:6379> sadd demos 2
(integer) 1
127.0.0.1:6379> sadd demos 3
(integer) 1
127.0.0.1:6379> sadd demos 5
(integer) 1

# 查看set集合demos中的内容
127.0.0.1:6379> smembers demos
1) "1"
2) "2"
3) "3"
4) "5"

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

  • hash集合操作 (类似map)
# 单个值操作
127.0.0.1:6379> hset map1 name zhangsan
(integer) 1
127.0.0.1:6379> hget map1 name
"zhangsan"

# 多个值操作 此时相当于可以存储对象
127.0.0.1:6379> hmset map2 name zhangsan age 22 sex 1 mobile 18202179701
OK
# 获取某个属性
127.0.0.1:6379> hmget map2 name
1) "zhangsan"
# 获取对象全部内容
127.0.0.1:6379> hgetall map2
1) "name"
2) "zhangsan"
3) "age"
4) "22"
5) "sex"
6) "1"
7) "mobile"
8) "18202179701"
  • stream格式 (5.0稳定版本新增,了解一下,后续补充完整)
127.0.0.1:6379> xadd test * apple 1
1507383725597-0
127.0.0.1:6379> xadd test * binana 2
1507383735965-0

127.0.0.1:6379> xrange test 1507383725597-0 1507383735965-0
1) 1) 1507383725597-0
   2) 1) "apple"
      2) "1"
2) 1) 1507383735965-0
   2) 1) "binana"
      2) "2"

其实以上命令开发的时候基本上用不上,对Java和Python等语言都有第三方封装好了Api直接导入使用

三 Redis缓存高并发情况下

Java使用例子

  • 实现方式1
    原文引用:https://www.cnblogs.com/williamjie/p/9395659.html
public class RedisTool {

    private static final String LOCK_SUCCESS = "OK";
    private static final String SET_IF_NOT_EXIST = "NX";
    private static final String SET_WITH_EXPIRE_TIME = "PX";

    /**
     * 尝试获取分布式锁
     * @param jedis Redis客户端
     * @param lockKey 锁
     * @param requestId 请求标识
     * @param expireTime 超期时间
     * @return 是否获取成功
     */
    public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {

        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
        if (LOCK_SUCCESS.equals(result)) {
            return true;
        }
        return false;
    }
}

可以看到,我们加锁就一行代码:jedis.set(String key, String value, String nxxx, String expx, int time),这个set()方法一共有五个形参:

第一个为key,我们使用key来当锁,因为key是唯一的。

第二个为value,我们传的是requestId,很多童鞋可能不明白,有key作为锁不就够了吗,为什么还要用到value?原因就是我们在上面讲到可靠性时,分布式锁要满足第四个条件解铃还须系铃人,通过给value赋值为requestId,我们就知道这把锁是哪个请求加的了,在解锁的时候就可以有依据。requestId可以使用UUID.randomUUID().toString()方法生成。

第三个为nxxx,这个参数我们填的是NX,意思是SET IF NOT EXIST,即当key不存在时,我们进行set操作;若key已经存在,则不做任何操作;

第四个为expx,这个参数我们传的是PX,意思是我们要给这个key加一个过期的设置,具体时间由第五个参数决定。

第五个为time,与第四个参数相呼应,代表key的过期时间。

总的来说,执行上面的set()方法就只会导致两种结果:1. 当前没有锁(key不存在),那么就进行加锁操作,并对锁设置个有效期,同时value表示加锁的客户端。2. 已有锁存在,不做任何操作。
  • 实现方式2
    或者直接使用第三方封装好了的
    Redisson:https://github.com/redisson/redisson/wiki/8.-distributed-locks-and-synchronizers#81-lock
    简单,相当于重入锁的使用方式,加锁-业务逻辑-解锁流水线
RLock lock = redisson.getLock("myLock");
// 加锁
lock.lock();
// 或者设置加锁时间,防止代码报错后,锁不释放
lock.lock(10, TimeUnit.SECONDS);
// 再或者每个一段时间尝试加锁一次
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
// 以上三种方式都可以
if (res) {
   try {
     ...
   } finally {
       // 最后解锁,让其他线程进来
       lock.unlock();
   }
}

maven引入

<!-- https://mvnrepository.com/artifact/org.redisson/redisson -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.11.2</version>
</dependency>

四 Redis和Memcache对比

  • memcache是一个分布式的内存对象缓存系统,并不提供持久存储功能,而redis拥有持久化功能(其实memcache也支持部分延迟持久化到磁盘)
  • memcache数据存储基于LRU(简单说:最近、最少使用key会被剔除),而redis则可以永久保存(服务一直运行情况下)
  • memcache是多线程的(这是memcache优势之一),也就意味着阻塞情况少,而redis是单线程的,阻塞情况相对较多,两者性能上相差不大
  • memcache只支持简单的k、v数据存储,而redis支持多种数据格式存储。
  • memcache是多线程、非阻塞IO复用网络模型,而redis是单线程IO复用模型

五 Redis基本概念整理截图

Redis初识,第1张

以上为Redis技能浅谈,对于新手还算比较实用。


https://www.xamrdz.com/backend/3c81937930.html

相关文章: