redis6.2(一)安装、配置、常用数据类型

1、linux上redis的安装(6.2.1)

(1)安装C 语言的编译环境

yum install centos-release-scl scl-utils-build
yum install -y devtoolset-8-toolchain
scl enable devtoolset-8 bash

测试gcc版本

[root@bigdata-cdh01 bin]# gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

(2)下载redis-6.2.1.tar.gz上传到linux上

[root@bigdata-cdh01 softwares]# ll
total 2388
-rw-r--r-- 1 root root 2438367 Apr  2  2021 redis-6.2.1.tar.gz

(3)解压命令:tar -zxvf redis-6.2.1.tar.gz

(4)解压完成后进入目录:cd redis-6.2.1, 在redis-6.2.1目录下再次执行make命令(只是编译好)

注意:

如果没有准备好C语言编译环境,make会报错—Jemalloc/jemalloc.h:没有那个文件

解决方案:运行make distclean,然后在redis-6.2.1目录下再次执行make命令(只是编译好)

(5) 继续执行: make install

(6)默认的安装目录在/usr/local/bin

[root@bigdata-cdh01 softwares]# cd /usr/local/bin
[root@bigdata-cdh01 bin]# ll
total 32172
-rw-r--r-- 1 root root       92 Nov 22 22:29 dump.rdb
-rwxr-xr-x 1 root root  9658226 Nov 22 22:24 redis-benchmark
lrwxrwxrwx 1 root root       12 Nov 22 22:24 redis-check-aof -> redis-server
lrwxrwxrwx 1 root root       12 Nov 22 22:24 redis-check-rdb -> redis-server
-rwxr-xr-x 1 root root  9766801 Nov 22 22:24 redis-cli
lrwxrwxrwx 1 root root       12 Nov 22 22:24 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 13418268 Nov 22 22:24 redis-server


查看默认安装目录:
redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何
redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲
redis-check-dump:修复有问题的dump.rdb文件
redis-sentinel:Redis集群使用
redis-server:Redis服务器启动命令
redis-cli:客户端,操作入口

(7)前台启动,命令行窗口不能关闭,否则服务器停止

[root@bigdata-cdh01 bin]# redis-server
6822:C 22 Nov 2022 23:03:48.517 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
6822:C 22 Nov 2022 23:03:48.517 # Redis version=6.2.1, bits=64, commit=00000000, modified=0, pid=6822, just started
6822:C 22 Nov 2022 23:03:48.517 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
6822:M 22 Nov 2022 23:03:48.517 * Increased maximum number of open files to 10032 (it was originally set to 1024).
6822:M 22 Nov 2022 23:03:48.517 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.2.1 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 6822
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

......

(8)后台启动(推荐)

拷贝一份redis.conf到其他目录
[root@bigdata-cdh01 bin]# cp /export/softwares/redis-6.2.1/redis.conf /usr/local/bin/


后台启动设置daemonize no改成yes


[root@bigdata-cdh01 bin]# redis-server ./redis.conf

# 注意此时只能本机连接
[root@bigdata-cdh01 bin]# ps -ef | grep 6379
root       6849      1  0 23:06 ?        00:00:00 redis-server 127.0.0.1:6379
root       6855   2220  0 23:06 pts/0    00:00:00 grep 6379

# 测试验证: ping
[root@bigdata-cdh01 bin]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> 


# 关闭
单实例关闭:redis-cli shutdown
也可以进入终端后再关闭
[root@bigdata-cdh01 bin]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> shutdown
not connected> 
[root@bigdata-cdh01 bin]# ps -ef | grep 6379
root       6863   2220  0 23:09 pts/0    00:00:00 grep 6379

备注:

redis默认16个数据库,类似数组下标从0开始,初始默认使用0号库
使用命令 select   <dbid>来切换数据库。如: select 8 
统一密码管理,所有库同样密码。
dbsize查看当前数据库的key的数量
flushdb清空当前库
flushall通杀全部库

2、redis配置文件

(1)网络相关配置

bind

默认情况bind=127.0.0.1只能接受本机的访问请求
不写的情况下,无限制接受任何ip地址的访问
生产环境肯定要写你应用服务器的地址;服务器是需要远程访问的,所以需要将其`注释掉`


如果开启了protected-mode,那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的响应

protected-mode

将本机访问保护模式设置no

port

端口号,默认 6379

tcp-backlog

设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。
在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。

注意Linux内核会将这个值减小到/proc/sys/net/core/somaxconn的值(128),所以需要确认增大/proc/sys/net/core/somaxconn和/proc/sys/net/ipv4/tcp_max_syn_backlog(128)两个值来达到想要的效果

timeout

一个空闲的客户端维持多少秒会关闭,0表示关闭该功能。即永不关闭。

tcp-keepalive

对访问客户端的一种心跳检测,每个n秒检测一次。

单位为秒,如果设置为0,则不会进行Keepalive检测,建议设置成60

(2)通用设置

daemonize

是否为后台进程,设置为yes

守护进程,后台启动

pidfile

存放pid文件的位置,每个实例会产生一个不同的pid文件

loglevel

指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为****notice****

四个级别根据使用阶段来选择,生产环境选择notice 或者warning

databases 16

设定库的数量 默认16,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id

(3)安全相关

redis6.2(一)安装、配置、常用数据类型_第1张图片

访问密码的查看、设置和取消

在命令中设置密码,只是临时的。重启redis服务器,密码就还原了。

永久设置,需要再配置文件中进行设置。

redis6.2(一)安装、配置、常用数据类型_第2张图片

(4)限制相关

maxclients

Ø 设置redis同时可以与多少个客户端进行连接。

Ø 默认情况下为10000个客户端。

Ø 如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应。

maxmemory

Ø 建议必须设置,否则,将内存占满,造成服务器宕机

Ø 设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。

Ø 如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。

Ø 但是对于无内存申请的指令,仍然会正常响应,比如GET等。如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素。

maxmemory-policy

Ø volatile-lru:使用LRU算法移除key,只对设置了过期时间的键;(最近最少使用)

Ø allkeys-lru:在所有集合key中,使用LRU算法移除key

Ø volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键

Ø allkeys-random:在所有集合key中,移除随机的key

Ø volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key

Ø noeviction:不进行移除。针对写操作,只是返回错误信息

maxmemory-samples

Ø 设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个。

Ø 一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小。

3、redis中的键

http://www.redis.cn/commands.html

keys *            查看当前库所有key    (匹配:keys *1)
exists key        判断某个key是否存在
type key          查看你的key是什么类型
del key           删除指定的key数据
unlink key        根据value选择非阻塞删除,仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。
expire key 10     10秒钟:为给定的key设置过期时间
ttl key           查看还有多少秒过期,-1表示永不过期,-2表示已过期

select    命令切换数据库
dbsize    查看当前数据库的key的数量
flushdb   清空当前库
flushall  通杀全部库

4、五大常用数据类型

(1)String类型

String是Redis最基本的类型,一个key对应一个value。

String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。

String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

set   <key><value>添加键值对

get     <key>查询对应键值
append  <key><value>将给定的<value> 追加到原值的末尾
strlen  <key>获得值的长度
setnx   <key><value>只有在 key 不存在时    设置 key 的值

incr  <key>
    将 key 中储存的数字值增1
    只能对数字值操作,如果为空,新增值为1
decr  <key>
    将 key 中储存的数字值减1
    只能对数字值操作,如果为空,新增值为-1
incrby / decrby  <key><步长>将 key 中储存的数字值增减。自定义步长。



mset  <key1><value1><key2><value2>  ..... 
同时设置一个或多个 key-value对  
mget  <key1><key2><key3> .....
同时获取一个或多个 value  
msetnx <key1><value1><key2><value2>  ..... 
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
原子性,有一个失败则都失败


getrange  <key><起始位置><结束位置>
获得值的范围,类似java中的substring,前包,后包
setrange  <key><起始位置><value><value>  覆写<key>所储存的字符串值,从<起始位置>开始(索引从0开始)。


setex  <key><过期时间><value>
设置键值的同时,设置过期时间,单位秒。
getset <key><value>
以新换旧,设置了新值同时获得旧值。
  • String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配.
  • 内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。

(2)List类型

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

它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

lpush/rpush  <key><value1><value2><value3> .... 从左边/右边插入一个或多个值。
lpop/rpop    <key>                              从左边/右边吐出一个值。值在键在,值光键亡。

rpoplpush   <key1><key2><key1>                列表右边吐出一个值,插到<key2>列表左边。

lrange      <key><start><stop>                 按照索引下标获得元素(从左到右)
lrange k1 0 -1   0左边第一个,-1右边第一个,(0-1表示获取所有)

lindex      <key><index>               按照索引下标获得元素(从左到右)
llen        <key>                      获得列表长度 

linsert     <key>  before <value><newvalue><value>的后面插入<newvalue>插入值
lrem        <key><n><value>                   从左边删除n个value(从左到右)
lset        <key><index><value>               将列表key下标为index的值替换成value
  • List的数据结构为快速链表quickList。首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。
  • 当数据量比较多的时候才会改成quicklist。因为普通的链表需要的附加指针空间太大,会比较浪费空间。

(3)Set类型

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

sadd       <key><value1><value2> ..... 
将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
smembers   <key>取出该集合的所有值。
sismember  <key><value>判断集合<key>是否为含有该<value>值,有1,没有0
scard      <key>返回该集合的元素个数。
srem       <key><value1><value2> .... 删除集合中的某个元素。
spop       <key>随机从该集合中吐出一个值。
srandmember <key><n>随机从该集合中取出n个值。不会从集合中删除。


smove      <source><destination>value把集合中一个值从一个集合移动到另一个集合
sinter     <key1><key2>返回两个集合的交集元素。
sunion     <key1><key2>返回两个集合的并集元素。
sdiff      <key1><key2>返回两个集合的差集元素(key1中的,不包含key2中的)
  • Set数据结构是dict字典,字典是用哈希表实现的。

    Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。

(4)hash类型

Redis hash 是一个键值对集合。

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

类似Java里面的Map

hset     <key><field><value><key>集合中的  <field>键赋值<value>
hget     <key1><field><key1>集合<field>取出 value 
hmset    <key1><field1><value1><field2><value2>... 批量设置hash的值
hexists  <key1><field>查看哈希表 key 中,给定域 field 是否存在。


hkeys    <key>列出该hash集合的所有field
hvals    <key>列出该hash集合的所有value
hincrby  <key><field><increment>为哈希表 key 中的域 field 的值加上增量 1   -1
hsetnx   <key><field><value>将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .
  • Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。

(5)Redis Zset(sorted set)

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。

不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。

因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。

zadd  <key><score1><value1><score2><value2>…
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。

zrange <key><start><stop>  [WITHSCORES]   
返回有序集 key 中,下标在<start><stop>之间的元素
带WITHSCORES,可以让分数一起和值返回到结果集。

zrangebyscore key minmax [withscores] [limit offset count]
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。

zrevrangebyscore key maxmin [withscores] [limit offset count]               
同上,改为从大到小排列。


zincrby  <key><increment><value>      为元素的score加上增量
zrem     <key><value>删除该集合下,指定值的元素 
zcount   <key><min><max>统计该集合,分数区间内的元素个数 
zrank    <key><value>返回该值在集合中的排名,从0开始。

SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。

zset底层使用了两个数据结构

  • (1)hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。

  • (2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

你可能感兴趣的:(java,数据库,redis,缓存)