在服务器上安装Redis及其使用笔记

准备

自己有购买云服务器的小伙伴可以将redis安装到服务器上,跟你安装到windows上的虚拟机是一样的。
1、进入redis官网下载最新的版本

在这里插入图片描述

2、因为redis运行需要gcc环境,我们可以通过Xshell操作远程服务器通过yum命令来安装

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

安装完可以通过命令gcc --version 查看版本信息
在这里插入图片描述
3、新建一个文件夹存放redis

mkdir redisfile

4、新建文件传输窗口将下载的压缩包上传到服务器
在这里插入图片描述
查看已经上传的压缩包

[root@VM-12-13-centos /]# cd redisfile/
[root@VM-12-13-centos redisfile]# ll
total 2928
-rw-r--r-- 1 root root 2994242 Jul 31 16:29 redis-7.0.4.tar.gz
[root@VM-12-13-centos redisfile]# 

安装

1、解压

cd /redisfile
tar -zxvf redis-7.0.4.tar.gz

2、解压完成后,进入redis-7.0.4 使用make命令进行编译

cd redis-7.0.4
make

没有gcc环境会报错,-Jemalloc/jemalloc.h:没有那个文件,解决:执行make distclean 命令,等待gcc安装完成,看到版本信息后,再次执行make
在这里插入图片描述
编译完成
在这里插入图片描述
3、跳过make test 继续执行make install
在这里插入图片描述
完成上述步骤已经安装成功了

4、查看安装目录,默认的安装路径在/usr/local/bin

cd /usr/local/bin

5、目录结构
在这里插入图片描述

 redis-check-aof:修复有问题的AOF文件,
 redis-benchmark:性能测试文件

使用

  1. 前台启动(不推荐,前台启动,命令行窗口不能关闭,否则服务器停止)
  2. 后台启动(推荐)

后台启动

1、备份redis.conf ,复制一份到其他目录
在这里插入图片描述
2、把复制户的redis.conf 文件的 daemonize no 改成yes

vim /redisfile/myredis/redis.conf

在这里插入图片描述
保存,退出

:wq

启动

cd /usr/local/bin/
redis-server /redisfile/myredis/redis.conf
查看进程:ps -ef | grep redis

在这里插入图片描述
测试联通状态;

redis-cli
ping   //出现PONG,说明是正常的

关闭(多种关闭方式)

shutdown
//exit
//或着找到对应的进程号,kill -9 13720 

在这里插入图片描述

redis相关知识介绍

redis默认有0~15共16个数据库,可以通过select index切换,比如我们切换到15号

select 15

  1. 默认初始使用0号库
  2. 使用命令select index切换,eg:select 15
  3. 统一密码管理,所有的库密码相同
  4. dbsize查看当前数据库的key数量
  5. flush清空当前库
  6. flushall通杀全部库
  7. redis是单线程+多路IO复用技术
  8. memcache是多线程+锁
    Redis与Memcache三点不同:支持多数据类型,支持持久化,单线程+多路IO复用

Redis键–key

  1. keys * ——查看当前所有key(匹配:keys *1)
  2. exists key——判断某个key是否存在
  3. type key —— 查看key类型
  4. del key——删除指定的key数据
  5. unlink key —— 根据value选择非阻塞删除(仅仅将keys从keyspace元数据中删除,真正删除会在后面异步操作)
  6. expire key time——为给定的key设置过期时间(time 单位为秒,eg:expire k1 10)
  7. ttl key 查看key的还有多少秒过期,返回值:-1表示永不过期,-2表示已经过期。
  8. select命令 ——切换数据库
  9. dbsize——查看当前数据库的key的数量
    10.flushdb——清空当前库,flushall——通杀所有库

1、常用五大数据类型

字符串(String)

1、简介

  • String是Redis最基本的类型,与MeMcached类似,一个key对应一个value。
  • String类型是二进制安全的,意味着Redis的string可以包含任何数据类型,比如jpg图片或者序列化的对象。
  • String类型是Redis最基本的数据类型,一个Redis中字符穿value最多可以是512M

2、常用命令

  set  <key>  <value> 
  *NX: 当数据库中key不存在时,可以将key-value添加到数据库。
  *XX:当数据库中key存在时,可以将key-value添加到数据库,与NX参数互斥。
  *EX:key的超时秒数。
  *PX:key的超时毫秒数,与EX互斥。

  get <key> :查询对应key的value值。
  append <key> <value> 将给定的<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> <key2> …… :同时设置多个值。
  mget <key1> <key2> …… :同时获取一个或多个值。
  msetnx  <key1> <key2> ……:同时设置一个或多个key-value对,当且仅当所有给定的key都不存在。(原子性,有一个失败则都失败。)
 
  注意:java中两个线程的i++操作不是不是原子操作,操作数的结果为(线程数~线程数*单线程执行次数)
  所谓原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何context switch(切换到另一个线程)
  (1)在单线程中,能够在单条指令中完成的操作都可以认为是“原子操作”,因为中断只发生于指令之间。
  (2)在多线程中,不能被其他进程(线程)打断的操作就叫原子操作。
  (Redis单命令的原子性主要得益于Redis的单线程)

  getrange  <key>  <起始位置>  <结束位置>:获得值的范围,类似java中的substring,前包,后包。
  setrange  <key> <起始位置>  <结束位置>:用<value>覆写所存储的字符串值,从<起始位置>开始(索引值从0开始)
  setex <key>  <过期时间>  <value>  设置键值的同时设置过期时间,单位秒。
  getset <key> <value> 以新换旧,设置了新值同时获得旧值。
[root@VM-12-13-centos ~]# redis-cli
127.0.0.1:6379> keys *
1) "k3"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 jack
OK
127.0.0.1:6379> set k2 locy
OK
127.0.0.1:6379> set k3 daming
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> get k1
"jack"
127.0.0.1:6379> get k2
"locy"
127.0.0.1:6379> append k1 is a handsome boy
(error) ERR wrong number of arguments for 'append' command
127.0.0.1:6379> append k1 "is a handsome boy"
(integer) 21
127.0.0.1:6379> get k1
"jackis a handsome boy"
127.0.0.1:6379> strlen k1
(integer) 21
127.0.0.1:6379> strlen k2
(integer) 4
127.0.0.1:6379> setnx k1 v2
(integer) 0
127.0.0.1:6379> get k1
"jackis a handsome boy"
127.0.0.1:6379> setnx k4 v200
(integer) 1
127.0.0.1:6379> incr k4
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set k5 100
OK
127.0.0.1:6379> get k5
"100"
127.0.0.1:6379> incr k5
(integer) 101
127.0.0.1:6379> decr k5
(integer) 100

3、底层数据结构
String的数据结构,为简单动态字符穿(SDS) ,是可以修改的字符串,内部结构实现类似于java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

列表List

简介:单键多值

  • Redis列表是简单的字符串列表,按照插入顺序排序,你可以通过添加一个元素到列表的头部(左边)或者尾部(右边)。
  • 它的底层实际是双向链表,对两端的操作性能很高,通过索引下标操作中间的节点性能会较差。

常用命令

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

rpoplpush <key1> <key2> :从<key1>列表右边吐出一个值,插到<key2>列表的左边。
lrange <key> <start> <stop>  :按照索引下标获得元素(从左到右)

lrange mylist 0 -1   :0表示左边第一个,-1表示右边第一个(0-1 表示获取所有)
lindex <key> <index> 按照索引下标获得元素(从左到右)
llen <key> 获得列表长度

linsert  <key> before/after <value><newvlue><value>的前面/后面插入<newvalue>插入值。
lrem <key> <n> <value> 从左边删除n个value(从左到右)
lset <key><index><value>将列表key下标为index的值替换为value。

数据结构
List的数据结构为快速链表quickList,首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也就是压缩列表。
它将所有的元素紧挨着一起存储,分配的是一块连续的内存。
当数据量比较多的时候才会改成quicklist。
因为普通的链表需要的附加指针空间太大,会比较浪费空间,比如这个列表里存的只是int类型的数据,结构上还需要两个额外的只针prev和next。

Set集合

1、简介

2、常用命令

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中的)


使用;

127.0.0.1:6379> sadd set1 m1 m2 m3 m4
(integer) 4
127.0.0.1:6379> smembers set1
1) "m2"
2) "m1"
3) "m4"
4) "m3"
127.0.0.1:6379> sismember set1 m2
(integer) 1
127.0.0.1:6379> sismember set1 m9
(integer) 0
127.0.0.1:6379> scard set1
(integer) 4
127.0.0.1:6379> srem set1 m1 m2
(integer) 2
127.0.0.1:6379> scard set1
(integer) 2
127.0.0.1:6379> sadd set1 m1 m2 m3 m4
(integer) 2
127.0.0.1:6379> smembers set1
1) "m4"
2) "m3"
3) "m1"
4) "m2"
127.0.0.1:6379> spop m3
(nil)
127.0.0.1:6379> spop set1
"m3"
127.0.0.1:6379> spop set1
"m1"
127.0.0.1:6379> srandmember <key> 2
(empty array)
127.0.0.1:6379> srandmember set1 2
1) "m2"
2) "m4"
127.0.0.1:6379> scard set1
(integer) 2
127.0.0.1:6379> sadd set2 m1 m2 m3 m4 m5 m6 m7 s8 s9
(integer) 9
127.0.0.1:6379> sadd set3 s1 s2 s3 s4 s5
(integer) 5
127.0.0.1:6379> smove set3 set2  s3
(integer) 1
127.0.0.1:6379> smembers k2
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> smembers set2
 1) "m3"
 2) "m6"
 3) "m5"
 4) "m1"
 5) "m2"
 6) "m4"
 7) "s8"
 8) "m7"
 9) "s3"
10) "s9"
127.0.0.1:6379> sinter set2 set3
(empty array)
127.0.0.1:6379> sinter set2 set1
1) "m2"
2) "m4"
127.0.0.1:6379> sunion set2 set3
 1) "s1"
 2) "s8"
 3) "s4"
 4) "m3"
 5) "m6"
 6) "s2"
 7) "m7"
 8) "s5"
 9) "m5"
10) "s3"
11) "s9"
12) "m2"
13) "m1"
14) "m4"
127.0.0.1:6379> sdiff set2 set1 
1) "s8"
2) "m7"
3) "m6"
4) "m3"
5) "s3"
6) "m5"
7) "s9"
8) "m1"

3、数据结构
Set数据结构是dict字典,字典是用哈希实现的。java中的hashSet的内部实现用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它内部也是用hash结构,所有的value都指向同一个内部值。

Redis的Hash结构

1、简介

  1. Redis hash是一个键值对集合。
  2. Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
  3. 类似java里面的Map<String,Object>

2、常用命令

hset <key> <field> <value><key>集合中的<field>键赋值<value>
hget <key1> <fielld><key1>集合<field> 取出 value
hmset <key1> <field1> <value1>   <key2> <field2> <value2>  ……: 批量设置hash的值。
hexists <key1> <field> 查看哈希表key中,给定域field是否存在。
hkeys  <key>列出该hash集合的所有field
hvals  <key>列出该hash集合的所有value
hincrby  <key><field><increment> 为哈希表key中的域field的值加上增量x /-x
hsetnx  <key><field><value> 将哈希表key中的域field的值设置为value,当且仅当域field不存在。

eg:

[root@VM-12-13-centos ~]# redis-cli
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> hset user:1001 id 1
(integer) 1
127.0.0.1:6379> hset user:1001 name zhangsan 
(integer) 1
127.0.0.1:6379> hget user:1001 id
"1"
127.0.0.1:6379> hget user:1001 name
"zhangsan"
127.0.0.1:6379> hmset user:1002 id 2 name lisi age 30
OK
127.0.0.1:6379> hget user:1002
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> hget user:1002 id
"2"
127.0.0.1:6379> hget user:1002 name 
"\x8dlisi"
127.0.0.1:6379> hexists user1002 id
(integer) 0
127.0.0.1:6379> hexists user:1002 id
(integer) 1
127.0.0.1:6379> hkeys user:1002
1) "id"
2) "name"
3) "age"
127.0.0.1:6379> hkeys user:1001
1) "id"
2) "name"
127.0.0.1:6379> hvals user:1002
1) "2"
2) "\x8dlisi"
3) "30"
127.0.0.1:6379> hvals user:1001
1) "1"
2) "zhangsan"
127.0.0.1:6379> hincrby user:1002 age 2
(integer) 32
127.0.0.1:6379> hincrby user:1002 age 3
(integer) 35
127.0.0.1:6379> hsetnx user:1002 age 40
(integer) 0
127.0.0.1:6379> hsetnx user:1002 sex men
(integer) 1
127.0.0.1:6379> hkeys user:1002
1) "id"
2) "name"
3) "age"
4) "sex"

3、数据结构
Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。

Redis有序 集合Zset

1、简介
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。
不同之处时有序集合的每个成员都关联了一个评分(score) ,这个评分被用来按照从最低分到最高分的方式排序集合中的成员,集合的成员是唯一的,但是评分可以是重复的。

因为元素是有序的,所以你也可以很快的根据评分或者次序来获取一个范围的元素。
访问有序集合的中间元素也是非常快的,因此,你能够使用有序集合作为一个没有重复成员的只能列表。

2、常用命令

zadd  <key> <score1> <value> <score2> <vaule2> …… :将一个或者多个member元素及其score值加入到有序集key当中。
zrange  <key> <stat> <stop> [WITHSCORE] :返回有序集key中,下标在start stop之间的元素,带WITHSCORE,可以让分数一起和值返回到结果集。
zrangebyscore key min max [withscores]  [limit offset count]:返回有序集key中,所有score值介于min和max之间 ,(包括都等于min或max的成员)

zrevrangebyscore key max min [withscores] [limit off set count]
同上,改为从大到小排列。
zincrby <key> <increment> <value>  为元素的score加上增量。
zrem <key>  <value> :删除该集合下,指定值的元素。
zcount  <key><min><max>  统计该集合,分数区间内的元素个数。
zrank  <key> <value> 返回该值在集合中的排名,从0开始。 

利用redis制作排行榜

zrange top 0 -1 withscores

3、数据结构

  1. hash:hash的作用就是关联元素value和权重score,保障value的唯一性,可以通过元素value找到相应的score值。
  2. 跳跃表:跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。
    跳跃表(跳表)
    简介:
    有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等,对于有序集合的底层实现,可以使用数组,平衡树,链表等,数据不便元素插入,删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低,Redis使用跳跃表,效率堪比红黑树,且结构比红黑树简单。

Redis配置文件redis.conf

units 配置大小单位,开头定义了一些基本单位,只支持bytes,不支持bit大小写不敏感

# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes

INCLUDES 包含

类似于jsp中的include ,多实例的情况可以把公用的配置文件提取出来。
bind 网络相关的配置

默认情况下 bind = 127.0.0.1 只能接受本机的访问请求
不写的情况下,无限制接收任何IP地址的访问。即支持远程连接。
生产环境下肯定要写你应用服务器的地址,服务器是需要远程访问的,所以需要将其注释掉。
如果开启了protected-mode,那么在没有设定bind ip且没有密码的情况下,Redis只允许接收本机的相应。反之支持远程访问。
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)两个值来达到想要的效果。

pidprofile
记录与redis运行的进程号相关。
loglevel
日志级别:notice、debug、verbose、warning四种级别
logfile
设置日志文件输出的路径,默认为空。
databases
redis默认的数据库数量。
security 安全

  • 访问密码的查看,设置和取消。
  • 在命令中设置密码,只是临时的,重启redis服务器,密码就 还原了。
    LIMITS 限制
  • 设置redis同时可以与多少个客户端进行连接。
  • 默认情况下为10000个客户端。
  • 如果达到了限制,redis则会拒绝新的连接请求,并向这些连接请求方发出“max number of clients reached"以做回应。
    maxmemory
  • 建议必须设置,否则,将内存占满,造成服务器宕机。
  • 设置redis可以使用的内存量,一旦 到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory- policy来指定。
    在这里插入图片描述

发布和订阅

简介:
Redis发布订阅(pub/sub)是一种消息通信模式,发送者发送信息,订阅者接收信息。
redis客户端可以订阅任意数量的频道。

在这里插入图片描述

/usr/local/bin/redis-cli   //开启两个客户端
SUBSCRIBE channel1   //客户端1订阅频道channel1 
publish channel1 "hello redis"   //客户端2发送消息"hello redis"  


发布:
在这里插入图片描述
订阅:
在这里插入图片描述

Redis新数据类型

Bitmaps
关于Bitmaps的相关搜索1
关于Bitmaps的相关搜索2
HyperLogLog
简介
在工作当中,我们经常会遇到与统计相关的功能需求,比如统计网站,PV(PageView页面访问量),可以使用Redis的incr、incrby轻松实现。
但是像UV独立访客,独立IP数、搜索记录数等需要去重和计数问题如何 解决?这种求集合中不重复的元素个数的问题称为基数问题。
解决方案:
(1) 数据存储在MySQL表中,使用distinct count计算不重复的个数。
(2)使用Redis提供的hash 、set、 bitmaps等数据结构来处理。
以上的方案结果是精确的,但是随着数据不断增加,导致占用内存空间越来越大,对于非常大的数据集是不切实际的。
能否能够降低一定的精度来平衡存储空间?Redis推出了HyperLogLog
Redis HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需要的空间总是固定的,并且是很小的。
在Redis里面,每个HyperLogLog键只需要花费12kb内存,就可以计算接近2^64个不同元素的基数,这和计算基数时,元素越多耗费内存越多的集合形成鲜明的对比。
但是,因为HyperLogLog只会根据输入元素来计算基数,而不会存储输入的元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。

命令
格式

pfadd <key> <element> ……  

作用:添加指定元素到HyperLogLog中。

实例:成功返回1,不成功返回0

[root@VM-12-13-centos ~]# redis-server /redisfile/myredis/redis.conf 
[root@VM-12-13-centos ~]# /usr/local/bin/redis-cli
127.0.0.1:6379> pfadd program "java"
(integer) 1
127.0.0.1:6379> pfadd program "php"
(integer) 1
127.0.0.1:6379> pfadd program "java"
(integer) 0
127.0.0.1:6379> pfadd program "c++" "mysql"
(integer) 1

pfcount  <key>   //计算HLL的近似基数,可以计算多个HLL,比如用HLL存储每天的UV,计算一周的UV可以使用7天的UV合并计算即可。

prmerge <destey> <sourcekey>  [sourcekey] //将一个或多个HLL合并后的结果存储到另一个HLL中,比如每月活跃用户可以使用每天的活跃用户合并计算可得。

Geospatial
简介
Redis中增加了对GEO类型的支持,GEO,Geographic,地理信息的缩写。
该类型,就是元素的2维坐标,在地图上就是经纬度,redis基于该类型,提供 了经纬度设置、查询、范围查询、距离查询、经纬度hash等常见操作。
命令
1、geoadd
格式:geoadd [logitude latitude member……]
说明:添加地理位置(经度-纬度-名称)
实例

geoadd china:city 121.47  31.23  shanghai
geoadd china:city 106.50  29.53  chongqing  114.05 22.52 shenzhen 116.38 39.90 beijing  ……

两极无法添加,一般会下载城市数据,直接通过java程序一次导入。
有效的经纬度从-180° 到 180° ,有效纬度从-85.05112878°到85.05112878°
当坐标位置超出指定范围时,该命令会返回一个错误。
已添加的数据,是无法再添加 的。

2、geopos
格式:geopos [member ……]
说明:获取指定的地区坐标值。

geopos china:city shanghai

3、geodist
格式:

geodist <key> <member1> <menber2> [m|mk|ft|mi]

说明:获取两个位置之间的直线距离

127.0.0.1:6379> geodist china:city guangzhou chongqing km
"1666.9766"

m:米
km:千米
mi:英里
ft:英尺
默认用米作为单位。
4、georadius
格式:

georadius key  logitude latitude radius m|km|ft|mi

说明:以给定的经纬度为中心找出某一半径内的元素。

实例:

127.0.0.1:6379> georadius  china:city 110 30 1000 km
1) "chongqing"

Redis_Jedis连接使用

使用Jedis连接远程的Redis时,需要将redis.conf 文件中的bind 127.0.0.0 注释掉,关闭保护模式 修改为: protected-mode no,若无法连接则是服务器端口没有开放6379端口。开放端口即可(若是虚拟机中的关闭防火墙并重启redis)

1、引入依赖

    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>3.2.0</version>
    </dependency>

2、新建测试类


import redis.clients.jedis.Jedis;

public class jedisTest {
    public static void main(String[] args) {
//        创建Jedis对象
        Jedis jedis = new Jedis("IP地址",6379);
//        测试
        String msg = jedis.ping();
        System.out.println(msg);
//输出结果为PONG则表示成功
    }
	  //    操作key
    @Test
    public void demo1() {
        Jedis jedis = new Jedis("43.142.131.251", 6379);
        jedis.set("key1","v1");
        jedis.set("key2","v2");
        jedis.set("key3","v3");
        Set<String> keys = jedis.keys("*");
        System.out.println(keys.size());
        for (String key : keys
        ) {
            System.out.println("key------->" + key);
        }
        System.out.println(jedis.exists("key1"));
        System.out.println(jedis.ttl("key1"));
        System.out.println(jedis.get("key1"));

//        设置多个key-value
        jedis.mset("k1","v1","k2","v2");
        List<String> mget = jedis.mget("k1","k2");
        System.out.println(mget);

    }


    //    操作list
    @Test
    public void demo2() {
        Jedis jedis = new Jedis("43.142.131.251", 6379);
       jedis.lpush("kk1","lucy","mary","jack");
       List<String> value = jedis.lrange("kk1",0,-1);
        System.out.println(value);

    }

    //    操作set
    @Test
    public void demo3() {
        Jedis jedis = new Jedis("43.142.131.251", 6379);
        jedis.sadd("name","lisi","jack");
        Set<String> strings = jedis.smembers("name");
        for (String string:strings
             ) {
            System.out.println(string);
        }


    }
    //    操作hash
    @Test
    public void demo4() {
        Jedis jedis = new Jedis("43.142.131.251", 6379);
        jedis.hset("users","age","20");
        jedis.hset("users","name","liHua");
       String hget1 = jedis.hget("users","age");
       String hget2 = jedis.hget("users","name");
        System.out.println(hget1+hget2);


    }
  //    操作zset
    @Test
    public void demo5() {
        Jedis jedis = new Jedis("43.142.131.251", 6379);
       jedis.zadd("china",100,"shanghai");
        Set<String> china = jedis.zrange("china", 0, -1);
        System.out.println(china);


    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值