zoukankan      html  css  js  c++  java
  • redis 介绍与常用操作

    redis

    1.redis简介

    中文官网: http://www.redis.cn/

    英文官网:https://redis.io

    参考命令:http://doc.redisfans.com/

    redis的优点:
    ​	属于内存型的数据库,存储速度非常快
    redis的缺点:
    ​	断电数据会丢失
    ​	redis服务挂掉之后数据也会丢失
    

    Redis 这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作。

    Redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。

    Redis(Remote Dictionary Server)由意大利人 Salvatore Sanfilippo 首次发布,现为最流行的NoSQL数据库。

    redis特性:

    1.速度快

    2.支持5种数据结构

    3.支持持久化操作,两种方式:RDB和AOF

    4.可自动操作,redis的操作都是原子操作

    5.支持多种语言,如Ruby、Python、Java、PHP等

    6.支持主从复制、哨兵机制、集群

    原子操作拓展:

    原子操作(atomic operation):最小的操作单位,不能继续拆分,高并发下不存在竞态条件。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。

    在多进程(线程)访问共享资源时,能够确保所有其他的进程(线程)都不在同一时间内访问相同的资源。而原子操作是不需要synchronized,这是Java多线程编程的老生常谈了。

    原子性是数据库的事务中的特性。在数据库事务的情景下,原子性指的是:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。

    对于Redis而言,命令的原子性指的是:一个操作不可以再分,操作要么执行,要么不执行。 Redis的操作之所以是原子性的,是因为Redis是单线程的。

    线程,是操作系统最小的执行单元,在单线程程序中,任务一个一个地做,必须做完一个任务后,才会去做另一个任务。

    2.redis的编译安装

    2.1 下载redis源码包

    wget http://download.redis.io/releases/redis-5.0.2.tar.gz
    

    2.2 解压缩

    tar -zxvf redis-5.0.2.tar.gz
    

    2.3 切换redis源码目录

    cd redis-4.0.10
    

    2.4 编译源文件

    make
    

    2.5 编译好后,src/目录下有编译好的redis指令

    2.6 make install 安装到指定目录,默认在/usr/local/bin

    make install
    

    2.7 创建redis配置文件

    mkdir -p /opt/redis_conf
    cd /opt/redis_conf
    vim redis-6379.conf
    

    2.8添加以下配置

    port 6379                         # 运行在6379的redis数据库实例
    daemonize yes                     # 后台运行redis  
    pidfile /data/6379/redis.pid      # 存放redis pid的文件
    loglevel notice                   # 日志等级
    logfile "/data/6379/redis.log"    # 指定redis日志文件的生成目录
    dir /data/6379                    # 指定redis数据文件夹的目录
    protected-mode yes                # 默认yes,外部连接需配置绑定ip或设置访问密码
    requirepass root             	  # 设置redis的密码,autho root验证登陆,不设则无需密码登陆
    
    port 6379                         
    daemonize yes                       
    pidfile /data/6379/redis.pid      
    loglevel notice                   
    logfile "/data/6379/redis.log"    
    dir /data/6379                    
    protected-mode yes               
    requirepass root           
    

    2.9 启动redis

    mkdir -p /data/6379				#创建日志文件夹
    redis-server 					#直接启动redis服务端,默认端口6379
    redis-server /opt/redis_conf/redis-6379.conf 	#指定配置文件启动redis服务
    netstat -tulp					#查看redis是否开启
    

    2.10 连接redis

    redis-cli #连接redis数据库,默认连接端口6379
    auth root	#auth 密码验证登陆
    redis-cli -p 6380 -a root #或者填上端口密码登陆
    参数详解:
        -p  设置redis连接的端口
        -a  显式的填写密码-auth
        --raw 使用原始格式,避免中文乱码
    127.0.0.1:6379 > ping #测试是否连接上redis,返回PONG表示连接上了
    

    3.redis的数据类型

    Redis数据类型分为:
    	字符串类型、散列类型、列表类型、集合类型、有序集合类型。
    	
    1. string类型:
    	字符串类型是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,也就是byte类型
    	最大容量是512M。
    2. hash类型:
    		hash用于存储对象,对象的结构为属性、值,值的类型为string。
    		key:{
                域:值[这里的值只能是字符串],
                域:值,            
                域:值,
                域:值,
                ...
    		}
    3. list类型:
    		列表的元素类型为string。
    		key:[ 值1,值2,值3..... ]
    4. set类型:
    	无序集合,元素为string类型,元素唯一不重复,没有修改操作。
    	{值1,值4,值3,值5}
    5. zset类型:
    	有序集合,元素为string类型,元素唯一不重复,没有修改操作。	
    

    3.1 key的操作

    keys *			#查看所有key
    set key		 	#新建key
    del key		 	#删除key
    keys pattern 	#通配符有? * [] ^ - 和转义
    exists key 	 	#存在返回1,不存在返回0
    type key		#返回key的数据类型,返回string/list/hash/set/zset
    rename oldkey newkey	#对key重命名,如果newkey存在则覆盖
    renamex oldkey newkey	#对key重命名,如果newkey存在则不覆盖
    randomkey				#随机返回一个key
    move key db-index		#将key移动到指定的数据库中,如果 key不存在或者已经在该数据库中,则返回0,成功则返回1。
    flushall		#清空数据库
    
    https://www.runoob.com/w3cnote/redis-intro-data-structure.html
    
    keys pattern
    支持的正则表达模式:
        h?llo 匹配 hello, hallo 和 hxllo
        h*llo 匹配 hllo 和 heeeello
        h[ae]llo 匹配 hello 和 hallo, 但是不匹配 hillo
        h[^e]llo 匹配 hallo, hbllo, … 但是不匹配 hello
        h[a-b]llo 匹配 hallo 和 hbllo
    

    3.2 string类型

    set key value	#赋值
    get key			#取值
    mset k1 v1 k2 v2	#给多个key赋值
    mget key1 key2		#获取多个key的值
    append key value	#追加
    strlen	key			#获取长度
    incr key		#自增,
    decr key		#自减
    incrby key n	#自增n
    decrby key n 	#自减n
    
    #incr key:自增,就是Mysql的AUTO_INCREMENT。每次执行 INCR key时,该key的值都会+1。若key不存在,则先建立一个0,然后+1,返回 1。如果值不是整数则报错。该操作是原子操作。
    
    #示例
    127.0.0.1:6379> set name '辰东'
    OK
    127.0.0.1:6379> set id 33
    OK
    127.0.0.1:6379> get name
    辰东
    127.0.0.1:6379> mget name id
    辰东
    33
    127.0.0.1:6379> mset name1 'dpc' id1 11
    OK
    127.0.0.1:6379> mget name1 id1
    dpc
    11
    127.0.0.1:6379> keys *
    id
    name1
    id1
    name
    127.0.0.1:6379> del name1
    1
    127.0.0.1:6379> del id1
    1
    127.0.0.1:6379> append name '大神'
    12
    127.0.0.1:6379> get name
    辰东大神
    127.0.0.1:6379> decr id
    21
    127.0.0.1:6379> decrby id 3
    18
    

    3.3 list类型

    列表类型存储了一个有序的字符串列表。常用的操作是向两端插入新的元素。时间复杂度为O(1),结构为一个链表,记录头和尾的地址。Redis数据类型的列表类型一个重大的作用那就是队列。新来的请求插入到尾部,新处理过的从头部删除。另外,比如微博的新鲜事,比如日志。列表类型就是一个下标从 0 开始的数组。由于是链表存储,那么越靠近头和尾的元素操作越快,越靠近中间则越慢。

    #常用操作
    lpush list v1 v2		#向左侧插入,返回增加后的列表长度
    rpush list v1 v2 		#向右侧插入,返回增加后的列表长度
    lpop list				#从左侧弹出,返回被弹出元素值
    rpop list				#从右侧弹出,返回被弹出元素值
    llen list				#列出元素个数
    lrange start end		#获取从start到end的元素列表(双闭合)
    ltrim list start end 	#截取片段
    lindex list index		#获取指定元素
    lset list index value	#设置指定元素的值
    linsert list before newvalue value1	#在某个值value1之前面追加值newvalue
    
    #示例
    127.0.0.1:6379> lpush name 'dpc' 'dpc1' 'dpc2'
    3
    127.0.0.1:6379> llen name
    3
    127.0.0.1:6379> lrange name 0 -1
    dpc2
    dpc1
    dpc
    127.0.0.1:6379> rpush name dpc3
    4
    

    3.4 hash哈希数据结构

    Redis是以字典(关联数组)的形式存储的,一个 key 对应一个 value。在字符串类型中,value 只能是一个字符串。那么在散列类型,也叫哈希类型中,value 对应的也是一个字典(关联数组)。那么就可以理解,Redis 的哈希类型/散列类型中,key 对应的 value 是一个二维数组。但是字段的值只可以是字符串。也就是说只能是二维数组,不能有更多的维度。

    #结构
    key:键 field:域/字段 value:值
    键 {
    	域1:值1
    	域2:值2
    	域3:值3
    }
    #操作
    hset key field value		#赋值,hset 键 域/字段 值
    hsetnx key field value		#当key不存在时赋值
    hget key field 				#取值
    hmget key f1 v1 f2 v2		#同一个key多个字段赋值
    hmget key field1 field2		#同一个key多个字段取值
    hgetall key					#获取key的所有字段和所有值
    hkeys key					#获取key的所有字段
    hvals key					#获取key的所有值
    hdel key f1 f2				#删除key的一个或各个字段
    hlen key					#获取key的字段数量
    hexists key field			#判断字段是否存在,存在返回1,否则返回0
    
    #示例
    hset news title "this is first tiltle"
    hset news content "this is the content"
    hlen news
    

    3.5 set集合类型

    redis的集合,是一种无序且元素唯一的集合,集合中的元素没有先后顺序。
    #常用操作
    sadd key value		#增加
    srem key value		#删除remove
    smembers key		#返回集合中所有的成员
    sismember key		#判断某个元素是否存在
    sdiff key1 key2		#对多个集合进行差集运算
    sinter key1 key2	#对多个集合进行交集运算
    sunion key1 key2	#对多个集合进行并集运算
    

    4.redis的配置详解

    redis 安装成功以后,window下的配置文件保存在软件 安装目录下,如果是mac或者linux,则默认安装/etc/redis/redis.conf

    linux下的apt命令安装:

    sudo apt install redis-server
    

    redis的核心配置选项

    • 绑定ip:如果需要远程访问,可将此⾏注释,或绑定⼀个真实ip

      bind 127.0.0.1

    • 端⼝,默认为6379

      port 6379

    • 是否以守护进程运⾏[这里的配置主要是linux和mac下面需要配置的]

      • 如果以守护进程运⾏,则不会在命令⾏阻塞,类似于服务
      • 如果以⾮守护进程运⾏,则当前终端被阻塞
      • 设置为yes表示守护进程,设置为no表示⾮守护进程
      • 推荐设置为yes

      daemonize yes

    • 数据⽂件

      dbfilename dump.rdb

    • 数据⽂件存储路径

      dir .

    • ⽇志⽂件

      logfile "C:/tool/redis/redis-server.log"

    • 数据库,默认有16个

      database 16

    • 主从复制,类似于双机备份。

      slaveof

    5.Redis的使用

    Redis 是一个高性能的key-value数据格式的内存缓存,NoSQL数据库。

    NOSQL:not only sql,泛指非关系型数据库。

    关系型数据库(mysql, oracle, sql server, sqlite):

    1. 数据存放在表中,表之间有关系。
    2. 通用的SQL操作语言。
    3. 大部分支持事务。
    

    非关系型数据库(redis,hadoop,mangoDB):

    1. 没有数据表的概念,不同的nosql数据库存放数据位置不同。
    2. nosql数据库没有通用的操作语言。
    3. 基本不支持事务,redis支持简单事务。
    

    redis:
    内存型(数据存放在内存中)的非关系型(nosql)key-value(键值存储)数据库,
    支持数据的持久化(注: 数据持久化时将数据存放到文件中,每次启动redis之后会先将文
    件中数据加载到内存),经常用来做缓存(用来缓存一些经常用到的数据,提高读写速度)。

    redis是一款基于CS架构的数据库,所以redis有客户端,也有服务端。

    其中,客户端可以使用python等编程语言,也可以终端命令行工具

    (https://img2018.cnblogs.com/blog/1815403/201911/1815403-20191127144140975-724557515.png)

    .png)

    redis客户端连接服务器:

    redis-cli -h `redis服务器ip` -p `redis服务器port`
    

    6.键操作

    • 查找键,参数⽀持正则表达式

      keys pattern

    • 例1:查看所有键

      keys *

    • 例2:查看名称中包含a的键

      keys a*

    • 判断键是否存在,如果存在返回1,不存在返回0

      exists key1

    • 例3:判断键a1是否存在

      exists a1

    • 查看键对应的value的类型

      type key

    • 例4:查看键a1的值类型,为redis⽀持的五种类型中的⼀种

      type a1

    • 删除键及对应的值

      del key1 key2 ...

    • 例5:删除键a2、a3

      del a2 a3

    • 查看有效时间,以秒为单位,key的剩余过期时间(time to live)

      ttl key

      ​ --如果key不存在或者已过期,返回 -2

      ​ --如果key存在并且没有设置过期时间(永久有效),返回 -1

    • 例7:查看键bb的有效时间

      ttl bb

    • 清空当前数据库中所有键值对

    flushall

    7.string

    如果设置的键不存在则为添加,如果设置的键已经存在则修改

    • 设置键值

      set key value

    • 例1:设置键为name值为xiaoming的数据

      set name xiaoming

    (https://img2018.cnblogs.com/blog/1815403/201911/1815403-20191127144202802-1181664815.png)

    • 设置键值及过期时间,以秒为单位

      setex key seconds value

    • 例2:设置键为aa值为aa过期时间为3秒的数据

      setex name 20 xiaoming

    关于设置保存数据的有效期

    # setex 添加保存数据到redis,同时设置有效期
    格式:
    	setex key time value
    # expire 给已有的数据重新设置有效期[注意,如果数据不存在或者已经早已过期,是设置无效的,而且这是重新指定有效期,不是追加有效期!!!]
    格式:
    	expire key time
    
    • 设置多个键值

      mset key1 value1 key2 value2 ...

    • 例3:设置键为a1值为python、键为a2值为java、键为a3值为c

      mset a1 python a2 java a3 c

    • 追加值[字符串拼接]

      append key value

    • 例4:向键为name,值为li,追加值xiaolong

      set name li

      append name xiaolong

      get name

      "lixiaolong"

    • 获取:根据键获取值,如果不存在此键则返回nil

      get key

    • 例5:获取键name的值

      get name

    • 根据多个键获取多个值

      mget key1 key2 ...

    • 例6:获取键a1、a2、a3的值

      mget a1 a2 a3

    自增自减

    对一个数值,进行+1 或者-1操作

    set num 10

    incr num # 11

    decr num # 10

    8.hash

    结构:

    键key:{
       	域field:值value,
        域field:值value,
        域field:值value,
    }
    
    • 设置单个属性

      hset key field value

    • 例1:设置键 user的属性namexiaohong

      hset user name xiaohong

    • 设置多个属性

      hmset key field1 value1 field2 value2 ...

    • 例2:设置键u2的属性namexiaohong、属性age11

      hmset u2 name xiaohongage 11

    • 获取指定键所有的属性

      hkeys key

    • 例3:获取键u2的所有属性

      hkeys u2

    • 获取⼀个属性的值

      hget key field

    • 例4:获取键u2属性name的值

      hget u2 name

    • 获取多个属性的值

      hmget key field1 field2 ...

    • 例5:获取键u2属性nameage的值

      hmget u2 name age

    • 获取所有属性的值

      hvals key

    • 例6:获取键u2所有属性的值

      hvals u2

    • 删除属性,属性对应的值会被⼀起删除

      hdel key field1 field2 ...

    • 例7:删除键u2的属性age

      hdel u2 age

    9.list

    列表的元素类型为string

    按照插⼊顺序排序

    • 在左侧插⼊数据 (注意先插进去的是value1,value1在value2右侧)

      lpush key value1 value2 ...

    • 例1:从键为a1的列表左侧加⼊数据a 、 b 、c

      lpush a1 a b c

    • 在右侧插⼊数据

      rpush key value1 value2 ...

    • 例2:从键为a1的列表右侧加⼊数据0、1

      rpush a1 0 1

    • 在指定元素的前或后插⼊新元素

      linsert key before或after 现有元素 新元素

    • 例3:在键为a1的列表中元素b前加⼊3

      linsert a1 before b 3

    设置指定索引位置的元素值

    • 索引从左侧开始,第⼀个元素为0

    • 索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素

      lset key index value

    • 例5:修改键为a1的列表中下标为1的元素值为z

      lset a 1 z

    • 删除指定元素

      • 将列表中前count次出现的值为value的元素移除
      • count > 0: 从头往尾移除
      • count < 0: 从尾往头移除
      • count = 0: 移除所有

      lrem key count value

    • 例6.1:向列表a2中加⼊元素a、b、a、b、a、b

      lpush a2 a b a b a b

    • 例6.2:从a2列表右侧开始删除2个b

      lrem a2 -2 b

    • 例6.3:查看列表a2的所有元素

      lrange a2 0 -1

    10.set

    • 添加元素

      sadd key member1 member2 ...

    • 例1:向键a3的集合中添加元素zhangsanlisiwangwu

      sadd a3 zhangsan sili wangwu

    • 返回所有的元素

      smembers key

    • 例2:获取键a3的集合中所有元素

      smembers a3

    • 删除指定元素

      srem key value

    • 例3:删除键a3的集合中元素wangwu

      srem a3 wangwu

    11.redis使用场景

    针对各种数据类型它们的特性,使用场景如下:
    字符串string: 用于保存一些项目中的普通数据或者具有时效性的数据,只要键值对的都可以保存,例如,保存session,定时记录状态,短信验证码,优惠券,积分,会员的时间长度
    哈希hash:用于保存项目中的一些字典数据,但是不能保存多维的字典,例如,商城的购物车,访问历史记录,权限数据
    列表list:用于保存项目中的列表数据,但是也不能保存多维的列表,例如,队列,秒杀,医院的挂号,派单系统,任务队列
    无序集合set:用于保存项目中的一些不需要在意顺序的数据,可以用于去重,例如,过滤投票系统的候选人,投票记录
    有序集合zset:用于保存项目中一些不能重复,但是需要进行排序的数据,例如,排行榜,数据分析表

    12.windows下redis下载和安装

    window系统的redis是微软团队根据官方的linux版本高仿的

    官方原版: https://redis.io/

    中文官网:http://www.redis.cn

    下载地址: https://github.com/MicrosoftArchive/redis/releases

    (https://img2018.cnblogs.com/blog/1815403/201911/1815403-20191127144301239-1936057856.png)

    (https://img2018.cnblogs.com/blog/1815403/201911/1815403-20191127144321770-1355852124.png)

    使用以下命令启动redis服务端

    redis-server C:/tool/redis/redis.windows.conf
    

    关闭上面这个cmd窗口就关闭redis服务器服务了。

    redis作为windows服务启动方式

    redis-server --service-install redis.windows.conf
    

    启动服务:redis-server --service-start
    停止服务:redis-server --service-stop

    启动内置客户端连接redis服务:

    13.本文参考博客

    [1] 超强、超详细Redis数据库入门教程 https://my.oschina.net/javagg/blog/471433

    [2] Redis 的操作为什么是的原子性的详解 https://blog.csdn.net/ahjxhy2010/article/details/80520434

  • 相关阅读:
    pandas 筛选指定行或者列的数据
    数据相关性分析方法
    导入sklearn 报错,找不到相关模块
    特征探索经验
    python 中hive 取日期时间的方法
    云从科技 OCR任务 pixel-anchor 方法
    五种实现左中右自适应布局方法
    vscode vue 代码提示
    js Object.create 初探
    webpack 加载css 相对路径 ~
  • 原文地址:https://www.cnblogs.com/sincere-ye/p/11940984.html
Copyright © 2011-2022 走看看