GoFrame gset使用入门 | 对比PHP、Java、Redis

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 这篇文章将会为大家介绍GoFrame gset使用入门,为了让大家更好的理解,会简明扼要的分析一下集合类型Set的特点,对比一下Java、PHP、原生Go对集合Set类型的支持情况,如果不支持Set类型,我们如何找到解决方案,来实现元素不可重复性和交差并补集的需求。

image.png

特点


集合gset:一组不可重复的元素,元素可以是任何类型

上一篇文章介绍的: GoFrame的garray为什么比PHP的array还好用? garray的排序数组也可以通过设置SetUnique(true),设置元素不可重复的特性。


使用入门


  1. 支持设置并发安全的开关
  2. 批量添加元素时,注意传参:切片后要加上... 即把切片打散之后添加
  3. Size() 获得集合大小
  4. Contains() 判断是否包含指定值
  5. Remove() 移除元素
  6. 支持使用Iterator遍历
  7. 可以通过 集合.String() ,一键将集合转成字符串
  8. 通过 集合.LockFunc() 实现并发安全写操作
  9. 通过 集合.RLockFunc() 实现并发安全读操作
  10. Clear() 清空集合


package main
import (
   "fmt"
   "github.com/gogf/gf/container/gset"
)
func main() {
   //创建一个并发安全的集合对象
   s := gset.New(true)
   //添加数据
   s.Add(1)
   // 批量添加数据
   s.Add([]interface{}{2, 3, 4, 5}...) //注意 这里要用... 即把切片打散之后添加
   // 打印结果
   fmt.Println(s)
   fmt.Println("集合的大小:", s.Size())
   fmt.Println("集合的大小:", s.Size())
   fmt.Println("集合中是否包含某个值:", s.Contains(5))
   fmt.Println("集合中是否包含某个值:", s.Contains(10))
   fmt.Println("返回数据项:", s.Slice())
   s.Remove(1) //删除的是数据项 不是根据索引删除
   fmt.Println("remove删除数据项之后:", s)
   // 遍历
   s.Iterator(func(v interface{}) bool {
      fmt.Println("遍历结果:", v)
      return true
   })
   // 集合转字符串
   fmt.Println("集合转字符串:", s.String())
   // 并发安全写锁操作
   s.LockFunc(func(m map[interface{}]struct{}) {
      m[6] = struct{}{}
   })
   // 并发安全读锁操作
   s.RLockFunc(func(m map[interface{}]struct{}) {
      fmt.Println("并发安全读锁操作:", m)
   })
   // 清空集合
   s.Clear()
   fmt.Println("清空集合后:", s)
}


打印结果


微信图片_20221112221919.jpg


对比PHP和Java


PHP


PHP是没有Set数据类型的,set关键字作为一个赋值函数使用。在PHP中,__set()方法可以用于为私有成员属性设置值,给一个未定义的属性赋值时会被触发;

使用Set一个非常重要的场景就是使用交差并补集;之前用PHP开发项目时,我们是使用Redis的Set来实现交差并补集需求的。


微信图片_20221112221923.jpg


JAVA


在Java中,是有Set类型的:存取无序,元素唯一。


GO原生


Go原生也是不提供Set类型的,但是GoFrame为我们提供了gset类型。


GoFrame


我们可以基于gset实现不可重复元素的需求,当然,如果是Java转Go的同学,使用gset应该会更加得心应手。


延伸


下图是Go原生提供的数据类型,让我们确信go原生并未支持set类型,但是支持Map类型。

而Map的key不能有重复值,当我们使用Go原生开发时,如果要实现不可重复元素的需求可以使用Map的这一特性。

Go原生开发要实现交差并补集,一样可以像我们一样,使用Redis的集合set,Redis还支持有序集合(sorted set)。


微信图片_20221112221926.jpg

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3天前
|
存储 缓存 NoSQL
如何在Java中使用Redis
如何在Java中使用Redis
|
2天前
|
NoSQL Java Redis
软件开发常见流程之宝塔初始化安装环境配置,Lam前面不选,直接跳商城,在宝塔内点击软件商城,安Mysql5.7,安java项目管理器,安Ngnix最新版,安Redis
软件开发常见流程之宝塔初始化安装环境配置,Lam前面不选,直接跳商城,在宝塔内点击软件商城,安Mysql5.7,安java项目管理器,安Ngnix最新版,安Redis
|
2天前
|
缓存 NoSQL Redis
Java面试之redis篇
Java面试之redis篇
10 0
|
3天前
|
JSON NoSQL Java
Redis18的Java客户端-StringRedisTemplate,序列化存在的问题,使用StringRedisTemplate解决序列化的方法
Redis18的Java客户端-StringRedisTemplate,序列化存在的问题,使用StringRedisTemplate解决序列化的方法
|
3天前
|
JSON NoSQL Java
Redis17----Redis的java客户端-RedisTemplte的RedisSerializer,赋值的是虎哥,而取出来的是ROSE的原因,使用keys
Redis17----Redis的java客户端-RedisTemplte的RedisSerializer,赋值的是虎哥,而取出来的是ROSE的原因,使用keys
|
3天前
|
NoSQL Java Redis
Redis15-Redis的java客户端,认识SpringDataRedis
Redis15-Redis的java客户端,认识SpringDataRedis
|
3天前
|
Java Redis 数据安全/隐私保护
Redis14----Redis的java客户端-jedis的连接池,jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,最好用jedis连接池代替jedis,配置端口,密码
Redis14----Redis的java客户端-jedis的连接池,jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,最好用jedis连接池代替jedis,配置端口,密码
|
2月前
|
安全 Java
从零开始学习 Java:简单易懂的入门指南之不可变集合、方法引用(二十六)
从零开始学习 Java:简单易懂的入门指南之不可变集合、方法引用(二十六)
|
1月前
|
存储 Java API
Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
30 0