缓存服务 Redis

Redis介绍

Redis(全称:Remote Dictionary Server 远程字典服务),是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
Redis内置 复制(replication),LUA脚本,LRU驱动事件,事务(transactions)和不同级别的磁盘持久化(persistence),并通过Redis哨兵(Sentinel)和自动分区(Cluster)提高可用性(high availability)。
读的速度:110000次/s,写的速度81000次/s。

缓存机制

说明:缓存中的数据其实就是数据库数据的备份,缓存机制就是有效的降低用户访问真是物理设备频次。
前提:缓存一般保存到内存中
问题:
- 缓存的内存空间如何维护;
- 如何保持数据的一致性;
- 缓存中的数据如何保证不丢失;
- 如何实现缓存高可用;

Redis安装

  • 下载,上传
  • 解压
    tar -xvf redis.tar.gz
    
  • 编译和安装Redis
    在redis根部录下执行
    make & make install
    

redis文件说明

  • CC C语言文件。
  • redis.check.rdg.o 数据持久化文件,将内存中的数据持久化到硬盘
  • redis.cli.o 相当于redis客户端,redis是一个服务器,所以需要客户端
  • redis.check.aop.o 另外的一种持久化文件

安装报错:

gcc: Command not found

解决办法:

  • 安装gcc编译器
yum install gcc -y
jemalloc/jemalloc.h: No such file or directory。

解决办法:

  • 网上错误解决办法:
    网上大部分解决办法都是错误的,如下文:
    (错误解决办法)
    make MALLOC=libc
    
  • 正确解决办法
    正确解决办法(针对2.2以上的版本)
    清理上次编译残留文件,重新编译
    make distclean  && make
    

导致出现这个错误的原因:

错误的本质是我们在开始执行make 时遇到了错误(大部分是由于gcc未安装),然后我们安装好了gcc 后,我们再执行make ,这时就出现了jemalloc/jemalloc.h: No such file or directory。这是因为上次的编译失败,有残留的文件,我们需要清理下,然后重新编译就可以了。

网上的解决办法是有什么错误吗?

网上的解决办法虽然最后也是可以成功安装好 redis ,但是是有一些隐患的,首先我们要知道redis 需要使用内存分配器的, make MALLOC=jemalloc 就是指定内存分配器为 jemalloc ,make MALLOC=libc 就是指定内存分配器为 libc ,这个是有安全隐患的,jemalloc 内存分配器在实践中处理内存碎片是要比libc 好的,而且在README.md 文档也说明到了,jemalloc内存分配器也是包含在源码包里面的,可以在deps 目录下看到 jemalloc 目录。

Redis启动

命令说明
redis-server直接启动出图标,不能其他错做
redis-server &&表示还有其他操作,启动不出图标,默认不能被用户远程访问,保护 模式是开启的
redis-server redis.conf配置文件开启
redis-cli -p 6379 shutdown停止
redis-cli shutdown停止
kill -9 8386停止
redis-cli -p 6379进入控制台
info replication查看当前节点状态
ps -ef |grep redis查看redis状态

修改Redis配置文件

  • 关闭IP绑定(第69行注释掉)
    在这里插入图片描述
  • 关闭保护模式 (第88行 改为no)
    在这里插入图片描述
  • 开启后台启动(启动时不出现图标,第136行改为yes)
    在这里插入图片描述

Redis命令

String 类型

命令说明举例
set添加key-valueset username admin
get根据key获取数据get username
strlen获取key的长度strlen key
exists判断key是否存在exists name,返回1存在,返回0不存在
del删除redis中的keydel key
keys用于查询符合条件的keykeys *(查询redis中的全部的key) ;keys n?me(使用占位符获取数据); keys nam*(获取nam开头的数据)
mset赋值多个key-valuemset key1 value1 key2 value2 key3 value3
mget获取多个key的值get key1 key2
append对某个key的值进行追加append key value
type检查某个key的类型type key
select切换redis数据库select 0-15 redis中一共有16个数据库
flushdb清空单个数据库flushdb
flushall清空全部数据库(慎用)flushall
incr自动加1incr key
decr自动减1decr key
incrby指定数值添加incrby 10
decrby指定数值减少decrby 10
expire指定key的失效时间,单位秒expire key 20,20秒后失效
pexpire指定key的失效时间,单位毫秒pexpire 200,200毫秒后失效
ttl检查key的剩余存活时间ttl key
persist撤销key的失效时间persist key

Hash类型

说明:可以用散列类型保存对象和属性值
例子:User对象{id:1,name:张三,age:18}

命令说明举例
hset为对象添加数据hset key field value
hget根据key对象的属性值hget key field
hexists判断对象的属性是否存在HEXISYS key field
hdel删除Hash中的属性hdel user field [field …]
hgetall获取Hash全部元素和值HGETALL key
hkeys获取Hash中所有的字段HKEY key
hlen获取Hash中所有属性的数量hlen key
hmget获取Hash里面指定字段的值hmget key field [field …]
hmset为Hash的多个字段设定值hmset key field value [field …]
hsetnx设置Hash的一个字段只有当这个字段不存在时有效HSETNX key field value
hstrlen获取Hash中指定key的长度HSTRLEN key field
hvals获取Hash的所有值HVALS user

List类型

说明:Redis中的LIst几个是双端循环列表,分别可以从左右两个方向插入数据;

  • List集合可以当队列使用,也可以当作栈使用:
    • 队列:存入数据的方向和获取数据的方向相反;
    • 栈:存入数据的方向和获取数据的方向相同;
命令说明举例
lpush从队列的左边入队一个或多个元素LPUSH key value
rpush从队列的右边入队一个或多个元素RPUSh key value
lpop从队列的左端出队一个元素LPOP key
rpop从队列的右端出队一个元素TPOP key
lpushx当队列存在时,从队列的左侧入队一个元素LPUSHX key value
rpushx当队列存在时,从队列的右侧入队一个元素RPUSHX key value
lrange从队列中获取指定返回的元素LRANGE key start stop,LRANGE key 0 -1 获取全部队列的数据
lrem从存于key的列表里移除前count次出现的值为value元素,这个count参数通过下面种方式影响这个操作:count>0,从头向尾部移除值为value的元素;count<0,从尾部向头部移除值为value的元素;count=0,移除所有值为value的元素LREM list -2 “hello” 会从存于list的列表里移除最后两个出现的hello。需要注意,如果list里没有存在key就会当作空list处理,所以当key不存在时,这个命令会返回0。
Lset设置index位置的list元素的值为valueLSET key index value

Redis事务命令

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

命令说明举例
multi标记一个事务开始127.0.0.1:6379> MULTI OK
exec执行所有multi之后发出的命令127.0.0.1:6379> EXEC OK
discard丢失所有multi之后发出的命令

Redis案例

添加依赖

		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>***</version>
		</dependency>

		<!--添加spring-datajar包  -->
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redis</artifactId>
			<version>***</version>
		</dependency>

操作Redis数据库

public class TestRedis {

    //String类型
    @Test
    public void test01() {
        Jedis jedis = new Jedis("192.168.31.181", 6379);
        jedis.set("username", "admin");
        System.out.println(jedis.get("username"));

    }

    //Hash类型
    @Test
    public void test02() {
        Jedis jedis = new Jedis("192.168.31.181", 6379);
        jedis.hset("user", "id", "1");
        jedis.hset("user", "name", "小明");
        jedis.hset("user", "age", "18");
        Map<String, String> user = jedis.hgetAll("user");
        System.out.println(user);
    }

    //List类型
    @Test
    public void test03() {
        Jedis jedis = new Jedis("192.168.31.181", 6379);
        jedis.lpush("list", "1,2,3,4,5", "6", "7");
        System.out.println(jedis.lpop("list"));
        System.out.println(jedis.lpop("list"));
        System.out.println(jedis.rpop("list"));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值