redis

nosql理解

  • 定义:非关系型数据库not only sql
  • 特点:1.方便扩展,解耦性高; 2.高性能,一秒读11万,写8万; 3.数据类型多样性,且不需要事先设计数据库,随取随用;
  • nosql四大分类:-----

-------1.k,v键值对;
-------2.文档型数据库(bson格式,和json一样)
MongoDB是基于分布式文件储存的数据库,主要用来处理大量的文档
MongoDB是一个介于关系型数据库和非关系数据中间的产品!是非关系型数据库中功能最丰富,最像关系型数据库的

ConthDB

-------列存储数据库
Hbse(大数据)
分布式文件系统
-------图关系数据库

redis

安装

#1.解压
	 tar -zxvf redis-6.0.10.tar.gz
 
 #2.安装
	 make
 
 #3.如果报错,可能是gcc 的版本过低,用gcc -v 查看版本,
	安装的gcc是4.5.8版本的,版本过低,执行以下命令升级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
	echo “source /opt/rh/devtoolset-9/enable” >> /etc/profile
	gcc -v

#4.执行install
	make install

#5.如果命令 which 和whereis 都找不到安装目录,可使用以下办法
	ps -ef|grep redis
	得到了进程号 xxxx
	然后 ls -l /proc/xxxx/cwd
	
#6.复制redis.conf到当前安装目录下,方便之后使用
	mkdir config
	cp /zt/redis-6.0.10/redis.conf config
	
#7.redis 默认不是后台启动 ,需要修改配置文件(守护进程模式启动)
	将 daemonize no 改成
	daemonize yes

#8.通过配置文件来启动服务
	redis-server config/redis.conf

#9.使用客户端进行连接测试
	#连接端口
	redis-cli -p 6379
	set name zhoutian
	get name

#查看所有的key
	keys *    

#10.关闭连接
	先shutdown
	再exit




测试性能 redis-benchmark

1.开启服务端,再连接一个客户端
2.查看redis是否开启
3.在bin目录下执行:
redis-benchmark -h localhost -p 6379 -c 100 -n 100000

redis基本知识和命令

#切换数据库
select 3
#清空当前数据库
flushdb
#清空所有数据库
flushall
#判断key是否存在
exists xxx
#移除一个键值对
move xxx
#设置数据的过期时间
expire xxx 10( 数据十秒钟后过期)
#查看数据类型
type  xxx

为什么redis这么快,确实单线程的?

五大基本数据类型

string


append key xxxx(在某个字符后追加字符)
strlen key(获取字符串的长度)

set views 0--------------incr views-----数据自增(用于浏览量等场景)decrby,自减
incrby views 10-----数据自增10

getrange key 0 2(获取字符串前三位)
setrange key 1 2 xxx(用xxx替换)

setex key 30 xxxx(字符串30秒后自动过期移除)
setnx key xxxx(如果key不存在再设置,不用覆盖)

mset k1 v1 k2 v2 k3 v3(批量设置值)
mget k1 k2 k3(批量的获取值)
msetnx k1 v1 k4 v4(如果都不存在才会设置成功,即有原子性特征)

mset user:1:name xxx user:1:age xxx(设置对象的值)

getset key xxx(如果不存在,返回null,并设置值;如果存在,返回对应的值,在进行设置值)

list(可以做栈,也可以做队列)

所有的list命令都是   L  开头

LPUSH list one (将一个或多个值放在列表的头部)
RPUSH list two(将一个或多个值放在列表的尾部)
LRANGE list 0 -1(取值)

LPOP list (从左移除一个)
RPOP list(移除最后一个)

LINDEX LIST 1(通过下标来获得一个值)

Lset list  0 xxx(将list中第一个元素替换为xxx)

LINSERT LIST AFTER 

set

sadd myset one(向myset集合中添加元素)
smembers myset(查看myset中的所有值)
sismember myset xxx(判断xxx是不是在set集合中)

scard myset (获取myset中的元素个数)
srem myset xxx(移除myset中的元素xxx)

srandmember myset(随机抽取一个元素)
spop myset(随机删除一个元素)

smove myset1 myset2 xxx (将xxx从myset1中移动到myset2中去)

数字集合类
---差集   sdiff set1 set2
---交集	  sinter set1 set2(共同好友,共同关注应用场景)
---并集	  sunion set1 set2

hash(哈希)

hset myhash key1 valu1(设置一个具体的kv键值)
hget myhash key1
hmset myhash k1 v1 k2 v2(设置多个字段值)
hmget myhash k1 k2

hgetall myhash(获取全部的数据)
hdel myhash key1(删除指定的数据)

hlen myhash (获取哈希表的长度)
hexists myhash key1(判断key1是否在哈希表中)

hkeys myhash(获取哈希表中所有的 key)
hsetnx myhash key1 value(如果不存在则可以设置,存在则不能设置)

hset user:1  name xxx(对象存储,一般使用hash表)


Zset(有序集合)

在set的基础上,增加了一个值,set myset v1 ------zset myset score1 v1

zset grade 67 zhangsan
zset grade  99 zhoutian
zset grade 88 lisi(设置set集合中的值)

zrangebyscore grade -inf +inf(显示全部,从小到大)
zrenvrange grade 0 -1 (从大到小排序)
zrangebyscore grade -inf +inf withscores(显示全部用户且附带成绩)
zrangebyscore grade -inf 90 wihescores(显示成绩小于90的升序排列)

zcout myset 1 3(获取指定区间的成员数量)
zrem grade zhangsan (移除指定的值)
zcard grade (获取元素个数)

三大特殊类型

geospatial(地理位置)

Hyperloglog

Bitmap

事务

Redis单条命令保证原子性,但是事务不保证原子性。
一个事务中所有的命令被序列化,在事务执行过程中,会按照顺序执行,且不允许打扰,即排它性

redis事务:

  • 开启事务:multi
  • 命令入队:(…)
  • 执行事务:(exec)
  • 放弃事务(discard)

编译型异常(代码有问题,命令有错),事务中所有的命令都不会执行
运行时异常(1/0),其他命令正常执行,错误的命令抛出异常

监控

  • 悲观锁–悲观的认为,线程是不安全的,总是会加锁
  • 乐观锁–乐观的认为,线程是安全的,不会上锁。在进行,写,跟新的时候会判断,在mybatisplus中,加入版本号来进行比较,是否被改动,如果被改动,重新执行,如果没有被改动则直接执行。在redis中,用watch字段来,进行监控字段,如果字段被改变则,事务执行结果为空。

jedis

使用java来操作redis。是官方推荐Java连接的开发工具

1.导入依赖

    <!--导入redis的依赖-->
    <dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
    </dependencies>

2.创建测试类

import redis.clients.jedis.Jedis;

public class TestRedis {
    public static void main(String[] args) {
        Jedis jedis=new Jedis("121.40.65.123",6379);
        System.out.println(jedis.ping());
        jedis.set("name","周天");
        System.out.println(jedis.get("name"));
        jedis.set("nickname","kkkkkkkkkkk");

    }
}

3.一般会遇到连接超时这个错误
这个时候需要,把Redis的配置文件中的,主机绑定注释掉

#bind 127.0.0.1

4.还会报错,提示protected-mode no
这时再将 配置文件中的protected-mode yes改成protected-mode no即可连接成功

springboot整合redis

springboot2.0后,原来使用的jedis被替换为 了lettuce
jedis:采用直连,多个线程操作的话是不安全的,如果要避免就必须使用jedispool连接池

lettuce:底层使用了Netty,实例可以在多个线程中共享,不存在不安全的情况

1.构建springboot项目,导入相应的redis依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2.配置文件


spring.redis.host=121.40.65.123
spring.redis.port=6379

3.编写测试类

package com.zt;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

@SpringBootTest
class SpringbootRedisApplicationTests {
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void contextLoads() {
        redisTemplate.opsForValue().set("nickname","tiantian");
        Object nickname = redisTemplate.opsForValue().get("nickname");
        System.out.println(nickname);
    }

}

4.当使用RedisTemplate储存对象信息时,要么将对象通过ObjectMapper转化为json字符,通过存储json来实现,要么需要将实体类序列化(implements Serializable)

5.自定义RedisTemplate,源码的RedisTemplate被@ConditionalOnMissingBean修饰,自定义注入bean后,原生的会失效。

6.可以提取一个RedisTemplate的工具类来简化开发

问题

在使用docker的Redis镜像启动时,出现启动后闪退的情况。
解决:

  • 检查配置文件是否设置了daemonize yes,如果是,就要改为daemonize no,因为该选项让redis成为在后台运行的守护进程,而docker容器必须要有一个前台进程才能留存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值