一、Redis概述

一、Redis概述

1、redis的安装
  1. redis是使用c语言编写的安装redis之前需要有c的运行环境

    • 查看当前是否有gcc的运行环境:

      gcc --version
      
    • 安装gcc

      yum install gcc # 在线安装gcc
      
  2. redis官网下载tar.gz压缩包,使用工具上传到 /opt目录下

    • 使用解压命令将压缩包解压

      tar -zxvf redis-6.2.1.tar.gz
      
    • 进入到 redis-6.2.1/目录下,使用make命令编译

      cd redis-6.2.1/
      make
      
    • 编译完成后使用make install 命令可以将redis安装完成

      make install
      
  3. redis安装完成之后,linux会将redis安装在 /usr/local/bin 目录下

    cd /usr/local/bin
    
    • 每个目录的意思

      redis目录结构

2、redis的启动
  • 方式一:前台启动(不推荐)

    redis-server # 启动之后可以使用ctrl+c退出
    
  • 方式二:后台启动(推荐)

    • 进入redis目录下拷贝一份redis.conf文件到任意目录下,这里选择 /etc/目录下

      cp redis.conf /etc/redis.conf
      
    • 打开/etc/目录下的redis.conf文件修改daemonize 的值 将no改为yes

      vim redis.conf # 打开修改之后,设置可以后台启动
      
    • 进入到redis的安装目录 /usr/local/bin 启动

      cd /usr/local/bin # 进入到redis的安装目录
      redis-server /etc/redis.conf # 通过指定redis配置文件的方式启动redis
      
    • 这样启动之后,我们这样去查看是否启动完成

      ps -ef|grep redis # 通过查看是否含有redis的进程
      
    • 测试验证,使用使用redis-cli启动客户端后使用ping命令,若返回PONG则启动成功

      [root@localhost bin]# redis-cli
      127.0.0.1:6379> ping
      PONG
      
    • 关闭redis服务器

      shutdown #使用shutdown命令退出
      
3、redis基础知识
  • redis默认有16个数据库,从0开始标号,默认使用0号库
    • 命令 : select 12 可以切换到12号数据库
    • 统一的密码管理,即16个库密码一致都是一样的
  • redis是单线程 + 多路IO复用
  • redis有五种常用的数据类型 : 字符串(String) 、列表(List) 、集合(Set) 、哈希(Hash) 、有序集合(Zset)
  • redis中使用键值对(key-value)存储数据
4、rdis中的通用命令
命令语法描述
keys *查看当前库所有的key(匹配 : keys *1)
exists key判断当前库中key是否存在
type key查看key是什么类型
del key删除指定key的数据
unlink key根据value选择非阻塞删除
(仅将key从keyspace元数据中删除,真正的删除操作会在后续异步操作)
expire key second给指定的key设置过期时间(如: expire k1 10 表示k1 10秒后过期)
ttl key查看key还有多少秒过期,-1表示永不过期,-2表示已经过期
select num切换数据库
dbsize查看当前数据库key的数量
flushdb清空当前库
flushall清空全部的库
5、redis字符串(String)
  • String是redis最基本的类型,String是二进制安全的,意味着redis中的String可以包含任意数据(如:.jpg图片或序列化的对象),一个redis中的字符串最多可以是512M

  • 常用命令

    命令语法描述
    set key value
    setnx key value
    setex key second value
    设置key-value,若key已经存在则覆盖
    * 只有在key不存在的时候才会设置key的值
    * 设置键值的同时,设置second秒后过期
    get key
    getset key value
    获取key对应的value值
    * 使用value替换掉key原来的value值,并且获取原来的value值
    append key value将给定的value追加到原值的末尾
    strlen key获取值的长度
    incr key将key存储的值 + 1
    (只能对数字值操作,否则报错,如果key为空,新增值为1)
    decr key将key存储的值 - 1
    (只能对数字值操作,否则报错,如果key为空,新增值为-1)
    incrby / decrby key step将key中存储的数字值按照指定step(步长)增加或减少
    mset k1 v1 k2 v2 …同时设置一个或多个key-value键值对
    mget k1 k2 …同时获取一个或多个key对应的value值
    msetnx k1 v1 k2 v2 …同时设置一个或多个key-value,当且仅当所有给定的key都不存在时
    getrange key begin end获取值的范围,类似java中的substring()方法,包括前,包括后
    setrange key begin value使用value从begin索引位置开始覆盖字符串值
  • 注意事项

    • 原子性:不会被线程调度机制打断的操作(即:操作一旦开始,就一直运行到结束,中间不会有任何线程切换的过程(context switch))

    • redis的单线程可以认为redis的命令都是原子性的,单条指令都可以认为是"原子操作",以为终端只能发生于指令之间

    • 对于上述命令中的m开始的命令语法,批量操作的都可以认为是原子操作(即: 任意一个是失败,整条命令都失败)

    • 思考: 对于java中 ++ 操作是否是原子操作?

      答: 不是,例如 : i = 0 ,两个线程同时操作 i++,执行100次那 i 的值会是多少? 2 - 200之间的值都有可能(包括 2 和 200 )

  • String的底层数据结构

    • String的数据结构为简单动态字符串(Simple Dynamic String,SDS)。是可以修改的字符串,内部结构的实现上有点类似与java中的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,内部为当前字符串实际分配的控件一般要高于实际字符串的长度,当字符串长度小于1M时,扩容都是加倍于现有的空间如果超过1M,扩容时一次只会多扩容1M的空间(注:字符串的最大长度为512M)
    • String数据结构
6、redis列表(List)
  • List是简单的字符串列表,按照插入顺序排序,底层实际上是一个双向链表,对两端的操作性能很高,通过索引下标操作中间节点性能较差

  • 常用命令

    命令语法描述
    lpop/rpop key从左边/右边删除一个值,并返回该值
    lpush/rpush key value1 value2 …从左边/右边插入一个或多个值
    rpoplpush key1 key2从key1列表右边删除一个值,插入到key2列表左边
    lrange key start stop
    lrange key 0 -1
    从左到右获取start到stop下标的元素
    表示获取key列表的全部元素(0:左边第一个,-1:右边第一个)
    lindex key index按照指定index索引获取key列表的元素(从左到右)
    llen key获取key列表的长度
    linsert key before value newValue在key列表的value元素的前面插入newValue元素
    linsert key after value newValue在key列表的value元素的后面插入newValue元素
    lrem key n value从左边删除key列表中n个值为value的元素
    lset key index value将列表key下标为index的值替换为value元素
  • List的底层数据结构

    • 首先在列表元素较少的情况下会使用一块连续的内存空间,这个结构是ziplist,它将所有的元素紧挨着一起存储,分配的是一块连续的内存,当数据量比较多的时候才会改成quicklist,因为普通的链表需要附加指针占用空间太大,浪费空间,redis中将链表和ziplist结合了起来,组成了quicklist,也就是将多个ziplist使用双向指针串起来使用,这样既满足了快速的插入删除性能,又不会出现太大的控件冗余
    • List数据结构
7、redis集合(Set)
  • Set对外提供的功能与list类似,不同在于Set是不能存放重复元素的,当不希望存储重复元素的时候是一个很好的选择,Set是String类型的无序集合,次鞥是一个value为null的Hash表,所以添加、删除、查找的复杂度都是O(1)

  • 常用命令

    命令语法描述
    sadd key value1 value2 …将一个或多个member元素添加到集合key中
    (已经存在的member元素将被忽略)
    smembers key取出该集合的所有值
    sismember key value判断集合key是否包含value元素(包含返回1,否则返回0)
    scard key返回该集合的元素个数
    srem key value1 value2 …删除集合key中的一个或多个元素
    spop key随机删除集合key中的一个元素,并返回值
    srandmember key n随机从集合key中取出n个元素,不会将元素删除
    smove sourceKey destKey value将集合sourceKey中的value元素移动到destKey集合中
    sinter key1 key2返回key1和key2集合的交集元素
    sunion key1 key2返回key1和key2集合的并集元素
    sdiff key1 key2返回key1和key2集合的差集元素
  • 数据结构

    • Set的数据结构是dict字典,字典是用哈希表实现的,Set的结构使用hash结构,所有的value都指向同一个内部值
8、redis哈希(Hash)
  • Hash是以个键值对集合,Hash是一个String类型的field和value的映射表,Hash特别适合用于存储对象

  • 常用命令

    命令语法描述
    hset key field value给key集合中的field键赋值value
    hget key field从key集合中取出field对应的value值
    hmset key field1 value1 field2 value2 …批量给key集合设置值
    hexists key field查看哈希表key中,给定域field是否存在(存在1,不存在0)
    hkeys key列出key哈希集合的所有field
    hvals key列出key哈希集合的所有value
    hincrby key field increment为哈希表key中的域field的值加上增量increment
    hsetnx key field value将哈希表key中的域field的值设置为value,当且仅当field不存在
  • 数据结构

    • Hash类型对应的数据结构是两种:ziplist(压缩列表)和hashtable(哈希表),当field-value的长度较短且个数较少时,使用ziplist,否则使用hashtable
9、redis有序集合(Zset [Sorted Set])
  • 有序集合Zset与普通集合Set非常相似,是一个没有重复元素的字符串集合,不同之处在于有序集合的每一个成员都关联了一个评分(score),这个根据score排序集合中的成员,集合的成员是唯一的,但是评分(socre)是可以重复的

  • 常用命令

    命令语法描述
    zadd key score1 value1 socre2 value2 …将一个或多个member元素及其score值加入到有序集合key中
    zrange key start stop [withscores]返回有序集合key,索引在start和stop之间的元素,
    若带上withscores可以将分数一块返回
    zrangebyscore key min max [withscores] [limit offset count]返回有序集合key中所有score值介于min和max之间(包含min和max)的成员,有序集合按照score值递增排序
    zrevrangebyscore key max min [withscores] [limit offset count]同上,但是是从大到小排序
    zincrby key increment value为元素的score加上增量 increment
    zrem key value删除key集合下指定value的元素
    zcount key min max统计该集合score 在min max区间内的元素个数
    zrank key value返回该值再集合中的排名,从0开始
  • 数据结构

    • Zset底层使用了两种数据结构
      • hash,hash的作用就是关联元素value和权重score,保证元素value的唯一性,可以通过元素value找到对应的score值
      • 跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表
redis安装 1: 下载redis-5.0.4.tar.gz 2: 解压源码并进入目录 tar zxvf redis-5.0.4.tar.gz cd redis-5.0.4 3: 不用configure 4: 直接make (如果是32位机器 make 32bit) 查看linux机器是32位还是64位的方法:file /bin/ls 注:易碰到的问题,时间错误. 原因: 源码是官方configure过的,但官方configure时,生成的文件有时间戳信息, Make只能发生在configure之后, 如果你的虚拟机的时间不对,比如说是2012年 解决: date -s ' yyyy-mm-dd hh:mm:ss ' 重写时间 再 clock -w 写入cmos 5: 可选步骤: make test 测试编译情况 (可能出现: need tcl >8.4这种情况, yum -y install tcl ) 6: 安装到指定的目录,比如 /usr/local/redis make PREFIX=/usr/local/redis install 注: PREFIX要大写 7: 复制配置文件 cp redis.conf /usr/local/redis 注path为解压后的安装路径 /root/gsj/redis-3.0.6 8: 让redis以后台进程的形式运行 vim /usr/local/redis/redis.conf 编辑redis.conf配置文件,修改如下内容; daemonize yes 9: make install之后,cd /usr/local/redis/bin得到如下几个文件 redis-benchmark 性能测试工具 redis-check-aof 日志文件检测工(比如断电造成日志损坏,可以检测并修复) redis-check-dump 快照文件检测工具,效果类上 redis-cli 客户端 redis-server 服务端 10: 启动与连接 启动redis并指定配置文件 cd /usr/local/redis ./bin/redis-server ./redis.conf #设置随机启动 vim /etc/rc.local 最后添加: /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf 连接: 用redis-cli cd /usr/local/redis/bin/ ./redis-cli #进入 exit /quit #退出 关闭redis pkill redis-server #关闭 ./redis-cli shutdown #关闭 查看是否启动成功 ps -ef | grep redis #查看端口是否占用 netstat -tunpl | grep 6379 11: 测试 String(字符串)类型: set name lijie #设置键name的值为lijie get name #获取name的值。
Redis是一个开源的、高性能的键值存储数据库系统,主要用于缓存数据和实现分布式数据结构,如发布订阅模式、列表、集合和有序集合等。它特别适合于需要快速读写操作的场景,例如Web应用中的会话管理、排行榜等。 **环境搭建步骤:** 1. **下载安装**: 根据你的操作系统(Windows, Linux或Mac),访问Redis官网(https://redis.io/download)下载适合的版本。推荐选择稳定版,如果是开发测试,也可以尝试最新的开发分支。 2. **解压并配置**: 解压缩下载的文件,然后进入目录,找到`redis.conf`文件。这是一个配置文件,你可以修改其中的设置来适应你的需求,比如端口、最大内存、密码保护等。 3. **启动服务**: 运行`redis-server`命令(在Linux/Mac上可能是`redis-server redis.conf`),按照提示启动服务。首次运行可能会自动创建默认的数据目录。 4. **验证安装**: 打开一个新的终端窗口,使用`redis-cli`工具连接到服务器,输入`INFO`命令查看服务器状态,确保安装成功。 5. **安全考虑**: 如果在生产环境中,强烈建议启用密码认证,可以通过编辑`redis.conf`设置`requirepass`选项来添加密码。 **相关问题--:** 1. Redis的主要用途是什么? 2. 如何通过命令行管理Redis? 3. 如何在配置文件中设置密码保护? 4. 开发环境中如何优雅地停止和重启Redis服务?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值