You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							75 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							75 lines
						
					
					
						
							1.9 KiB
						
					
					
				| package redis3 | |
| 
 | |
| import ( | |
| 	"github.com/redis/go-redis/v9" | |
| 	"github.com/seaweedfs/seaweedfs/weed/glog" | |
| 	"github.com/seaweedfs/seaweedfs/weed/util/skiplist" | |
| 	"google.golang.org/protobuf/proto" | |
| ) | |
| 
 | |
| func LoadItemList(data []byte, prefix string, client redis.UniversalClient, store skiplist.ListStore, batchSize int) *ItemList { | |
| 
 | |
| 	nl := &ItemList{ | |
| 		skipList:  skiplist.New(store), | |
| 		batchSize: batchSize, | |
| 		client:    client, | |
| 		prefix:    prefix, | |
| 	} | |
| 
 | |
| 	if len(data) == 0 { | |
| 		return nl | |
| 	} | |
| 
 | |
| 	message := &skiplist.SkipListProto{} | |
| 	if err := proto.Unmarshal(data, message); err != nil { | |
| 		glog.Errorf("loading skiplist: %v", err) | |
| 	} | |
| 	nl.skipList.MaxNewLevel = int(message.MaxNewLevel) | |
| 	nl.skipList.MaxLevel = int(message.MaxLevel) | |
| 	for i, ref := range message.StartLevels { | |
| 		nl.skipList.StartLevels[i] = &skiplist.SkipListElementReference{ | |
| 			ElementPointer: ref.ElementPointer, | |
| 			Key:            ref.Key, | |
| 		} | |
| 	} | |
| 	for i, ref := range message.EndLevels { | |
| 		nl.skipList.EndLevels[i] = &skiplist.SkipListElementReference{ | |
| 			ElementPointer: ref.ElementPointer, | |
| 			Key:            ref.Key, | |
| 		} | |
| 	} | |
| 	return nl | |
| } | |
| 
 | |
| func (nl *ItemList) HasChanges() bool { | |
| 	return nl.skipList.HasChanges | |
| } | |
| 
 | |
| func (nl *ItemList) ToBytes() []byte { | |
| 	message := &skiplist.SkipListProto{} | |
| 	message.MaxNewLevel = int32(nl.skipList.MaxNewLevel) | |
| 	message.MaxLevel = int32(nl.skipList.MaxLevel) | |
| 	for _, ref := range nl.skipList.StartLevels { | |
| 		if ref == nil { | |
| 			break | |
| 		} | |
| 		message.StartLevels = append(message.StartLevels, &skiplist.SkipListElementReference{ | |
| 			ElementPointer: ref.ElementPointer, | |
| 			Key:            ref.Key, | |
| 		}) | |
| 	} | |
| 	for _, ref := range nl.skipList.EndLevels { | |
| 		if ref == nil { | |
| 			break | |
| 		} | |
| 		message.EndLevels = append(message.EndLevels, &skiplist.SkipListElementReference{ | |
| 			ElementPointer: ref.ElementPointer, | |
| 			Key:            ref.Key, | |
| 		}) | |
| 	} | |
| 	data, err := proto.Marshal(message) | |
| 	if err != nil { | |
| 		glog.Errorf("marshal skiplist: %v", err) | |
| 	} | |
| 	return data | |
| }
 |