redis学习(一) 初步了解redis

想起之前学习redis做的笔记乱七八糟,有时候回顾一下都比较难,现在就像整理一下发布,然后借此回忆一下reids

1基础

1.1redis

  • 提供海量数据存储访问
  • 数据存储在内存里,读取更快
  • 非关系型、分布式、开源、水平扩展
  • NoSql
  • 分布式缓存中间件
  • key-value存储

1.2Nosql简介

  • Not Only Sql
  • 传统项目使用纯数据库
  • 为互联网和大数据而生
  • 水平(横向)扩展方便高效
  • 高性能读取、高可用
  • 一般存数据,做缓存

1.3缓存方案对比

1.3.1Ehcache=》适合单应用

优点:

  • 基于java开发
  • 基于JVM缓存
  • 简单、轻巧、方便

缺点:

  • 集群不支持
  • 分布式不支持

1.3.2Memcache

优点:

  • 简单的key-value存储
  • 内存使用率比较高
  • 多核处理,多线程

缺点:

  • 无法容灾=》重启后之前数据无法恢复
  • 无法持久化

1.3.3Redis

优点:

  • 丰富的数据结构
  • 持久化
  • 主从同步、故障转移,
  • 内存数据库

缺点:

  • 单线程
  • 单核

 

2安装Redis

2.1linux安装

1.首先去官网下载

2.进入到指定文件位置,解压

tar -zxvf redis-6.0.9.tar.gz

#解压说明 tar -zxvf 文件全称

3.进入redis文件夹

4.安装redis之前需要安装一个依赖: yum install gcc-c++

5.开始安装redis,先make编辑

6.开始安装: make install  ;安装完成之后需要配置redis,先进入 utils文件夹下

7.然后拷贝redis的启动脚本,拷贝到/etc/init.d/文件夹下:

cp redis_init_script /etc/init.d/

8.再把redis文件夹下的redis.conf拷贝到/usr/local/redis 下;然后进入/usr/local/redis 文件夹下 ,修改redis.conf     =>  vim  redis.conf

9. 配置相关信息:,设置完毕之后按 ESC 输入 :wq!   回车

daemonize 修改no

10.设置redis启动脚本

11.给脚本设置权限。然后启动: ./redis_init_scrip start

2.2常见安装错误

需要更新gcc

1、安装gcc套装:
yum install cpp
yum install binutils
yum install glibc
yum install glibc-kernheaders
yum install glibc-common
yum install glibc-devel
yum install gcc
yum install make
2、升级gcc
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
3、设置永久升级:
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

3redis基础

3.1常见命令

#关闭redis
redis-cli -a password shutdown

#关闭redis
./redis_init_script stop

#进入redis客户端
redis-cli

#输入密码
auth pwd

#设置缓存
set key value  例如 set id 12

#获取缓存
get key   例如 get id

#删除缓存
del key   例如 del id

#查看是否存活
redis-cli -a password ping

3.2redis类型

3.2.1 string字符串


string:最简单的字符串类型键值对缓存,也是最基本的
 


key相关
keys* :查看所有的key (不建议在生产上使用,有性能影响)
type key : key的类型


string类型
get/setdel :查询设置/删除
set rekey data:设置已经存在的key ,会覆盖
setnx rekey data :设置已经存在的key ,不会覆盖


set key value ex time :设置带过期时间的数据
expire key :设置过期时间
ttl:查看剩余时间,-1永不过期,-2过期


append key :合并字符串
strlen key :字符串长度
incr key :累加1
decr key :类减1
incrby key num :累加给定数值
decrby key num:累减给定数值


getrange key start end :截取数据, end=-1代表到最后
setrange key start newdata :从start位置开始替换数据


mset :连续设值
mget :连续取值
msetnx :连续设置,如果存在则不设置


其他
select index :切换数据库,总共默认16个
flushdb :删除当前下边db中的数据
flushall :删除所有db中的数据

3.2.2hash


hash :类似map ,存储结构化数据结构,比如存储一 个对象(不能有嵌套对象)
使用

hset key property value :
-> hset user name 2233
->创建一个user对象,这个对象中包含name属性, name值为2233


hget user name :获得用户对象中name的值
hmset:设置对象中的多个键值对
-> hset user age 18 phone 139123123


hmsetnx :设置对象中的多个键值对,存在则不添加
-> hset user age 18 phone 139123123


hmget :获得对象中的多个属性
-> hmget user age phone


hgetall user :获得整个对象的内容
hincrby user age2 :累加属性
hincryfloat user age 2.2 :累加属性
hlen user :有多少个属性
hexists user age :判断属性是否存在
hkeys user :获得所有属性
hvals user :获得所有值
hdel user :删除对象

3.2.3list


list:列表,[a,b,c...].
使用

lpush userList 1 2 3 4 5:构建一-个list, 从左边开始存入数据
rpush userList 1 2 3 45 :构建一-个list ,从右边开始存入数据
lrange list start end :获得数据

lpop:从左侧开始拿出一一个数据
rpop:从右侧开始拿出一一个数据

pig cow sheep chicken duck

lien list : list长度
lindex list index :获取list下标的值
lset list index value :把某个下标的值替换
linsert list before/after value :插入-一个新的值
Irem list num value :删除几个相同数据
ltrim list start end :截取值。替换原来的list

3.2.4zset
 

sorted set :排序的set ,可以去重可以排序,比如可以根据用户积分做排名,积分作为set的一一个数值,根据数值可以做排序。set中的每- -个memeber都带有-一个分数

使用

使用
zadd zset 10 value1 20 value2 30 value3 :设置member和对应的分数
zrange zset 0-1 :查看所有Zset中的内容
zrange zset 0-1 withscores :带有分数

zrank zset value :获得对应的下标
zscore zset value :获得对应的分数

zcard zset :统计个数
zcount zset 分数1 分数2 :统计个数

zrangebyscore zset 分数1 分数2 :查询分数之间的member(包含分数1分数2)
zrangebyscore zset (分數1 (分数2 :查询分数之间的member (不包含分数1和分数2 )
zrangebyscore zset 分数1 分数2 lmit start end:查询分数之间的member(包含分数1分数2)。获得的结果集再次根据下标区间做重询
zrem zset value :删除member

4springboot整合redis

yml配置文件代码 application.yml

#tomcat 配置
server:
  port: 8899
  servlet:
    context-path: /

spring:
  redis:
    database: 1
    host: 127.0.0.1
    port: 6379
#    password:  没有就可以不写

controller代码

package com.item.redisDemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/redis")
public class DemoRedisController {
    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/set")
    public Object set(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
        return "Ok";
    }

    @GetMapping("/get")
    public Object get(String key) {
        String o=(String) redisTemplate.opsForValue().get(key);
        return o;
    }

    @GetMapping("/delete")
    public Object  delete(String key) {
        redisTemplate.delete(key);
        return "0k";
    }

}

请求示例

5缓存相关

5.1缓存穿透

       查询的key在redis中不存在,对应的id在数据库也不存在。此时被非法用户进行攻击,大量的请求会去数据库(DB)造成宕机,从而影响整个系统。这种现象称之为 缓存穿透;比如请求id是999的数据,redis和数据库都不存在,由于redis没有,每次都会去请求数据库

       解决方法:缓存redis把空的数据也缓存到redis中,比如空字符串,空对象等;【999,""】这样,即便数据库没有也返回一个空值

5.2缓存雪崩

       缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

      缓存雪崩一般只能缓解,不能杜绝;
      解决方式:缓存永不过期、过期时间错开(避免大量缓存同一时间过期)、多缓存结合(redis、Memcache)【先请求redis,没有就去Memcache】、采购第三方redis(比如阿里云)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值