Redis入门笔记1

Redis

本章知识点

三 Redis入门

3.1 数据库理论


按照早期的数据库理论,比较流行的数据库模型有三种,分别为层次式数据库、网络式数据库和关系型数据库(前两者已经基本消失)。
 而当今的互联网中,最常用的数据库模型主要是两种即 关系型数据库 和 非关系型数据库。

关系型数据库:关系型数据库以行和列的形式存储数据,以便于用户理解。这一系列的行和列被称为表,一组表组成了数据库。(列是固定 行动态添加)。常见的关系型数据库MySQLOracleSQLserver

非关系型数据库:非关系型数据库也被称为NoSQL数据库,NoSQL的本意是“Not Only SQL”,指的是非关系型数据库,而不是“No SQL”的意思(没有SQL语句?),因此,NoSQL的产生并不是要彻底否定关系型数据库,而是作为传统关系型数据库的一个有效补充。NoSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能。

在这里插入图片描述

3.2 Redis数据库服务

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持[字符串][哈希表][列表][集合][有序集合][位图][hyperloglogs]等数据类型。内置复制、[Lua脚本]、LRU收回、[事务]以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动[分区]。

① redis是开源的 底层是c语言。    
② redis的存储是基于内存的。
      电脑:  内存 16G   Redis数据是存储到内存中  可以进行持久化 
             硬盘 500G  MySQL数据存储是存储到硬盘
    Redis为什么比MySQLRedis直接从内存中查数据  
    MySQL需要先从硬盘中将数据加载到内存再查询数据
 
③ 作为数据库。  
     我们使用Redis 用来存储的是 临时数据 缓存数据
    
④ 作为消息队列
      Redis可以做消息队列 但是不擅长
    
⑤ 支持5种数据类型
  关系型数据库:行和列的形式进行存储  
  非关系型数据库中的Redis是以key-value的形式进行存储 类似于我们JavaHashMap
     
  strings, hashes, lists, sets, sorted sets
    
  StringMap<String,String>  
  List:    Map<String,List>  
  Hash:    Map<String,Map>   
  Set:     Map<String,Set>

⑥ 内置 复制、[Lua脚本]、LRU(最少做小算法 FIFO)收回、[事务])以及不同级别磁盘持久化功能
 (redis不仅可以存储数据到内存 也可以持久化到硬盘rdb和aof)

⑦Redis Sentinel提供高可用---哨兵机制  

⑧ Redis Cluster 集群   redis集群版

⑨ redis以前是单线程的  6.0以后变成了多线程      Redis最新版本7.0

3.3 Redis优势

Redis 与其他 key - value 缓存产品有以下三个特点:

①Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

②Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

 Redis存储形式时key-value的形式 但是value可以是 基本类型 也可以是list set  hash  zset

③Redis支持数据的备份,即master-slave模式的数据备份。

Redis 优势

①性能极高 – Redis能读的速度是110000/s,写的速度是81000/s 。

②丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, SetsOrdered Sets 数据类型操作。

③原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。

④丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。 

Redis与其他key-value存储有什么不同?

① Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。      

② Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

3.4 Redis安装

克隆一台linux主机  修改ip地址 hostname  重启
安装gcc-c++ : yum  -y  install gcc-c++
在home下创建一个redis的文件夹: mkdir  /home/redis
移动到这个文件夹下:   cd  /home/redis
下载redis : wget  https://download.redis.io/releases/redis-5.0.9.tar.gz
解压redis: tar -zxvf  redis-5.0.9.tar.gz
进入到redis解压目录: cd  redis-5.0.9
编译并运行:make  && make install PREFIX=/usr/local/redis
    
    
移动到redis的安装目录:  cd  /usr/local/redis
启动redis :  ./bin/redis-server
当我们直接这样启动的时候 此时我们当前xshell窗口已经被redis占用,我们使用ctrl+z 此时会停止redis。    
    
    
修改守护线程(相当于让redis服务启动的时候 能在后台运行)
将配置文件拷贝到bin目录下:cp /home/redis/redis-5.0.9/redis.conf /usr/local/redis/bin
修改bin下的配置文件: vim /usr/local/redis/bin/redis.conf 
将136行改为 yes   开启守护进程   底行模式 :136 确定

    
再次启动redis的时候 需要我们用配置文件启动
运行redis: ./bin/redis-server  ./bin/redis.conf
客户端连接: ./bin/redis-cli
    
在连接上redis之后 如果想关闭redis 服务: 
shutdown
shutdown save
    
ctrl+c  退出连接
    
ps -ef | grep  redis  找到进程号  kill -9  进程号    

3.5 Redis的类型和常用命令

3.2.1 redis的操作GEO

添加地理位置

GEOADD  china  116.23128 40.22077 bj  121.48941 31.40527 sh 113.27324 23.15792 gz 113.88308 22.55329 sz

获取深圳的坐标

GEOPOS  china  sz

计算深圳到上海之间的距离

GEODIST  china  sz  sh  km

获取 116.23128 40.22077 位置 800km以内的地区

GEORADIUS  china  116  40  800  km

获取深圳800km范围内的城市

GEORADIUSBYMEMBER  china  sz  800  km

获取深圳的hash值

GEOHASH  china  sz

3.2.2 Redis中的 Strings 相当于java中的 Map<String,String>

添加key-value    set   key  value 
SET   a   123456
获取redis中的所有key
keys   *
获取对应key的数据  get  key
GET   a
删除对应key的数据  del  key
DEL  a

面试题: 请问redis中怎么存储Java对象?( java中要往redis存储数据 你好 世界 set a 你好世界 People对象 )

A hash

B json (将java对象转换成json字符串,将来从redis中取出来的时候还是json字符串,再将json字符串转换成java对象)

C 序列化 (将java对象进行序列化编码,将编码存储到redis中,将来取出来还是编码,在进行反序列化还原成java对象)

D 逻辑key 1 张三 18 北京

set  test  abcdefg

获取test子字符                               Getrange  test  1  3
给test重新赋值qwerdf并获取以前的值             getset  test  qwerdf
获取多个key的值                              mget  test  test1
创建test2 并且5秒后过期                       setex test2  5  hahaha  
设置test3 如果没有就设定                      setnx test3  hehehe  
将test第三位后面改成lalala                    setrange  test  3  lala
获取test的长度                               strlen  test
同时设定多个key-value                         mset  t1 a t2 b  t3 c  
Expire test 10

Set  index  0
给index原子性自增1                            INCR  index
给index原子性自减1                            DECR  index
给index原子性自增2                            INCrBY index  2      
给index原子性自增2.5                          INCEBYFLOAT  index  2.5
给index追加haha                              APPEND  index 33

3.2.3 redis中的hash Map<String,Map>

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

添加一个set数据        hset       stu  id    1
                     Hset       stu  name 张三
                     Hset       stu  age   18
添加多个数据           hmset      stu  address  北京  grade 一年级
获取全部内容           hgetall    stu
根据关键字获取值        hget       stu   age
获取多个               hmget      stu  id  name  age
获取所有的关键字        hkeys      stu
获取所有的值           hvals      stu
获取长度               hlen      stu
删除某个或多个关键字     hdel      stu   id  name  age
删除stu这个hash        del       stu

3.2.4 redis中的list Map<String,List>

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

左添加数据到list中     lpush    no   1   2   3  4  5  
右添加数据到list中     rpush   no    6  7  8  9   10 
获取长度               llen     no
获取指定索引的数据      lindex   no   3
获取指定范围内的数据    lrange   no    0  -1
在1的前面添加aa       linsert   no  before  1  aa
指定索引位置添加数据   lset    no   1  haha
左删除第一个数据       lpop   no
右删除第一个数据       rpop   no
裁剪指定区域数据       ltrim   no  3   6 

应用场景 : 微博关注 粉丝列表 消息队列等 MQ

3.2.5 Redis 的 Set Map<String,Set>

是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

添加数据到set中     sadd  haha  aa  bb  cc  dd  aa
获取长度            scard  haha
获取所有的元素      smembers   haha  
删除set中的元素     spop   haha  2

Sadd  hehe   aa  bb  cc  dd  ee  
查看第一个集合和其他集合的差异     sdiff    hehe   haha
查看两个集合的交际               sinter   haha   hehe
查看两个集合的交际并存储          sinterstore   heihei  haha  hehe

应用场景 : 共同粉丝

3.2.6 Redis 有序集合(sorted set)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

添加数据  zadd  jifen   1.2 zhangsan  2.5 lisi 3.6 wangwu 4.8 zhaoyun 5.9 maliu
查看属性  zcard  jifen
更新数据  zadd  jifen   4.4  zhangsan
查看积分榜   zrangebyscore    jifen   1    9
查看1-5分的数据数量    zcount  jifen   1  5
查询索引0-3之间的数据  zrange  jifen   0  3

应用场景: 排行榜 积分系统

3.6 Java链接Redis

1 导入jar包
    <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

 2  Redis 配置文件 需要配置 
    bind   192.168.150.130 

 3 启动Redis   ./redis-server   redis.conf

 4 java程序 链接Redis完成数据的存储
public class JavaTest {
    
    

    public static void main(String[] args) {
    
    
        
        Jedis jedis = new Jedis("192.168.150.130", 6379);
        jedis.set("hahaha","666666");

    }
}

猜你喜欢

转载自blog.csdn.net/Liu_wen_wen/article/details/127314401