zoukankan      html  css  js  c++  java
  • 分布式数据存储 之 Redis(一) —— 初识Redis

    分布式数据存储 之 Redis(一) —— 初识Redis

    为什么要学习并运用Redis?Redis有什么好处?我们步入Redis的海洋,初识Redis。

    一、Redis是什么

    Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。(来自官方的官方的解释!)

    二、Redis的运用场景

    ​ 1.高频访问

    ​ 2.热点数据

    ​ 3.固定不变的数据

    ​ 4.读写比列读操作较高的数据

    等等,还有更多的运用场景,这是Redis特性所决定的!

    三、Redis可以做什么

    ​ 1.数据库

    ​ 2.缓存

    ​ 3.消息中间件

    ​ 4.注册中心

    ​ 5.分布式锁 (另一种实现方式:zookeeper)

    四、Redis常见的数据结构

    Redis支持多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets) 与范围查询, bitmapshyperloglogs地理空间(geospatial) 索引半径查询。

    1.strings

    字符串

    常用命令

    1.设置或获取值

    ​ 通常用SET commandGET command来设置和获取字符串值

    例:

    > set mykey somevalue
    OK
    > get mykey
    "somevalue"
    

    参数:

    ​ **ex ** :
    ​ 过期时间(秒)
    nx
    ​ 当key存在时SET会失败,或相反的,当key不存在时它只会成功。

    ​ 2.修改或查询键空间

    ​ 1.判断是否存在

    exists

    exists mykey

    返回1或0标识给定key的值是否存在

    ​ 2.删除

    del

    del mykey

    返回1或0标识值是被删除(值存在)或者没被删除(key对应的值不存在)

    ​ 3.查看存储类型

    type

    type myket

    返回key对应的值的存储类型

    3.Redis超时:数据在限定时间内存活

    expire

    expire key 5

    设置超时时间,也可再次强调改变超时时间

    使用 PERSIST 命令去除超时时间

    参数

    ex
    set key 100 ex 10

    在创建值的时候设置超时时间

    ttl

    ttl key

    查看key对应的值剩余存活时间

    4.转换为 整型

    incr

    incr mykey

    ​ 将key 转换为 整型

    2.hashes

    散列

    数据结构类似于Map<Object,Map<Object,Object>>

    看起来就像一个 “hash” 的样子,由键值对组成

    常用命令

    hmset

    hmset person name admin age 10

    设置 hash 中的多个域

    hget

    hget person age

    取回单个域

    例:

    > hmset person name admin age 10
    OK
    > hget person age
    "10"
    

    3.lists

    列表

    常用命令

    lpush

    rpush mylist A

    向list的左边(头部)添加一个新元素

    rpush

    lpush mylist first

    向list的右边(尾部)添加一个新元素

    lrange

    lrange mylist 0 -1

    从list中取出一定范围的元素

    带有两个索引,一定范围的第一个和最后一个元素
    从尾部开始计数,因此-1表示最后一个元素,-2表示list中的倒数第二个元素,以此类推。

    rpop

    rpop mylist

    从list中删除元素并同时返回删除的值。可以在左边或右边操作

    例:

    > lpush list 1
    (integer) 1
    > rpush list 3
    (integer) 2
    > lrange list  0 10
    6) "1"
    7) "3"
    > rpop list
    "3"
    

    4.sets

    集合

    更适合不重复的数据类型

    常用命令

    sadd

    sadd myset 1 2 3

    把新的元素添加到 set 中

    smembers

    smembers myset

    查看

    例:

    127.0.0.1:6379> sadd myset 1 2 3
    (integer) 3
    127.0.0.1:6379> smembers myset
    1) "1"
    2) "2"
    3) "3"
    

    五、事务

    MULTIEXECDISCARDWATCH 是 Redis 事务相关的命令。事务可以一次执行多个命令, 并且带有以下两个重要的保证:

    • 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
    • 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

    命令

    MULTI

    ​ 用于开启一个事务,它总是返回 OK

    EXEC

    ​ 负责触发并执行事务中的所有命令

    例:

    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> set name 10
    QUEUED
    127.0.0.1:6379> set name a
    QUEUED
    127.0.0.1:6379> incr name
    QUEUED
    127.0.0.1:6379> exec 
    1) OK
    2) OK
    3) (error) ERR value is not an integer or out of range
    

    DISCARD

    ​ 事务放弃, 事务队列会被清空, 并且客户端会从事务状态中退出

    例:

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set name 100
    QUEUED
    127.0.0.1:6379> discard
    OK
    127.0.0.1:6379> get name
    "a"
    

    WATCH

    ​ 使得 EXEC 命令需要有条件地执行
    ​ 可以为 Redis 事务提供 check-and-set (CAS)行为
    ​ 监控某些值,防止该值在十五提交过程中被其他客户端改变

    WATCH mykey
    val = GET mykey
    val = val + 1
    MULTI
    SET mykey $val
    EXEC
    
    # 若值为nil 说明修改失败
    

    事务中的错误

    入队前

    ​ 大部分客户端都会停止并取消这个事务

    入队后

    ​ 命令可能在 EXEC 调用之后失败。
    ​ 事务正常执行,不会影响已经入队的结果

    为什么 Redis 不支持回滚(roll back)

    ​ Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面

    六、Redis 在 Docker 中的运用

    操作步骤

    1. 拉去 Redis 5.0.4镜像

      docker pull redis:5.0.4

    2. 启动 Redis

      docker run --name redis -p 6379:6379 redis:5.0.4 redis-server --appendonly yes

    3. 进入Redis 容器内部

      docker exec -it redis /bin/bash

    4. 连接服务端
      redis-cli

      参数
      ​ -h hostname
      ​ -p port
      ​ -n db(0~15)Database number

    把曾经失去的全部补回来! ---一位在“生死边缘”徘徊的JAVA程序猿
  • 相关阅读:
    The provided URI scheme 'http' is invalid; expected 'https'. Parameter name: via
    WCF传递Stream时,同时传递其它参数的问题
    DotNet NB 学习公众号
    军师旅团营连排班各有多少人
    OAuth 2.0学习
    人生三境界
    Mac OS安装Windows各版本时注意事项(2014年后的Mac机相信会有这些问题)
    C#中winform使用相对路径读取文件的方法
    Sql Server Report Service 的部署问题(Reporting Service 2014為什麼不需要IIS就可以運行)
    Reporting Services报表常用的URL参数
  • 原文地址:https://www.cnblogs.com/shi-tian/p/10818249.html
Copyright © 2011-2022 走看看